gray/src/gray.f

6706 lines
178 KiB
Fortran

implicit real*8 (a-h,o-z)
common/istop/istop
common/ierr/ierr
common/igrad/igrad
common/iovmin/iopmin,iowmin
common/mode/sox
common/p0/p0mw
common/powrfl/powrfl
common/index_rt/index_rt
common/taumnx/taumn,taumx,pabstot,currtot
common/ipass/ipass
c read data plus initialization
index_rt=1
call prfile
call paraminit
call read_data
call vectinit
if(igrad.eq.0) call ic_rt
if(igrad.gt.0) call ic_gb
if(ierr.gt.0) then
print*,' IERR = ', ierr
stop
end if
c beam/ray propagation
call gray_integration
c postprocessing
call after_gray_integration
pabstott=pabstot
currtott=currtot
powtr=p0mw-pabstot
if (iowmin.eq.2.and.ipass.gt.1) then
c second pass into plasma
p0mw1=p0mw
igrad=0
index_rt=2
p0mw=p0mw1*powrfl
call prfile
call vectinit2
call paraminit
call ic_rt2
call gray_integration
call after_gray_integration
pabstott=pabstott+pabstot
currtott=currtott+currtot
index_rt=3
sox=-sox
p0mw=p0mw1*(1.0d0-powrfl)
call prfile
call vectinit2
call paraminit
call ic_rt2
call gray_integration
call after_gray_integration
pabstott=pabstott+pabstot
currtott=currtott+currtot
end if
print*,' '
write(6,*) 'Pabs (MW), Icd (kA) = ', pabstott,currtott*1.0d+3
end
subroutine gray_integration
implicit real*8 (a-h,o-z)
common/ss/st
common/dsds/dst
common/istep/istep
common/nstep/nstep
common/istop/istop
common/strfl11/strfl11
common/index_rt/index_rt
c ray integration: begin
st0=0.0d0
if(index_rt.gt.1) st0=strfl11
do i=1,nstep
istep=i
st=i*dst+st0
c advance one step
call rkint4
c calculations after one step:
call after_onestep(istep,istop)
if(istop.eq.1) exit
c
end do
c ray integration: end
return
end
subroutine after_gray_integration
implicit real*8 (a-h,o-z)
parameter(zero=0.0d0)
character*24 filenmeqq,filenmprf,filenmbm
c
common/ss/st
common/ibeam/ibeam
common/warm/iwarm,ilarm
common/filesn/filenmeqq,filenmprf,filenmbm
common/nray/nrayr,nrayth
common/iieq/iequil
common/iipr/iprof
common/index_rt/index_rt
c
common/p0/p0mw
common/factb/factb
common/taumnx/taumn,taumx,pabstot,currtot
common/scal/iscal
common/facttn/factt,factn
c
c print all ray positions in local reference system
c
if(nrayr.gt.1) then
iproj=1
nfilp=9
call projxyzt(iproj,nfilp)
end if
c
c print final results on screen
c
print*,' '
print'(a,f9.4)','final step (s, ct, Sr) = ',st
if(iwarm.gt.0) then
print '(a,2e12.5)','taumn, taumx = ', taumn,taumx
else
print '(a,2f9.4)','taumn, taumx = ', zero,zero
end if
c
print'(a,f9.4)','Pabs_tot (MW) = ',pabstot
currtka =currtot*1.0d3
print'(a,f9.4)','I_tot (kA) = ',currtka
c
if (index_rt.eq.1) then
if(iequil.eq.2) write(6,*) 'EQUILIBRIUM CASE : ',filenmeqq
if(iequil.eq.1) write(6,*) 'ANALTYCAL EQUILIBRIUM'
if(iprof.eq.1) write(6,*) 'PROFILE file : ',filenmprf
if(iprof.eq.0) write(6,*) 'ANALTYCAL PROFILES'
if(ibeam.ge.1) write(6,*) 'LAUNCHER CASE : ',filenmbm
end if
c
c compute power and current density profiles for all rays
c
pabs=pabstot
currt=currtot
call pec(pabs,currt)
c
return
99 format(20(1x,e16.8e3))
end
c
c
c
subroutine after_onestep(i,istop)
implicit real*8 (a-h,o-z)
parameter(jmx=31,kmx=36,nmx=8000)
parameter(taucr=12.0d0,pi=3.14159265358979d0,cvdr=pi/180.0d0)
dimension psjki(jmx,kmx,nmx),ppabs(jmx,kmx,nmx),ccci(jmx,kmx,nmx)
dimension iiv(jmx,kmx),tauv(jmx,kmx,nmx),alphav(jmx,kmx,nmx)
dimension iop(jmx,kmx),iow(jmx,kmx)
dimension tau1v(jmx,kmx),yyrfl(jmx,kmx,6)
dimension xv(3),anv(3),xvrfl(3),anvrfl(3)
common/pcjki/ppabs,ccci
common/atjki/tauv,alphav
common/tau1v/tau1v
c
common/warm/iwarm,ilarm
common/nray/nrayr,nrayth
common/ist/istpr0,istpl0
common/istgr/istpr,istpl
c
common/iiv/iiv
common/iov/iop,iow
common/psjki/psjki
common/psival/psinv
common/psinv11/psinv11
common/ierr/ierr
common/taumnx/taumn,taumx,pabstot,currtot
common/xv/xv
common/anv/anv
common/cent/btrcen,rcen
c
common/p0/p0mw
common/pol0/psipol0,chipol0
common/ipol/ipolc
common/iovmin/iopmin,iowmin
common/densbnd/psdbnd
common/yyrfl/yyrfl
common/powrfl/powrfl
common/dstvac/dstvac
common/strfl11/strfl11
common/dsds/dst
common/index_rt/index_rt
common/ipass/ipass
common/rwallm/rwallm
common/bound/zbmin,zbmax
pabstot=0.0d0
currtot=0.0d0
taumn=1d+30
taumx=-1d+30
psinv11=1.0d0
iopmin=100
iowmin=100
c
do j=1,nrayr
kkk=nrayth
if(j.eq.1) kkk=1
do k=1,kkk
call gwork(j,k)
c
if(ierr.gt.0) then
! print*,' IERR = ', ierr
if(ierr.eq.97) then
c igrad=0
c ierr=0
else
istop=1
exit
end if
end if
psjki(j,k,i)=psinv
rrm=sqrt(xv(1)**2+xv(2)**2)/100.d0
zzm=xv(3)/100.d0
if(j.eq.1) rrm11=rrm
if (iwarm.gt.0.and.i.gt.1) then
if(psinv.ge.0.and.psinv.le.1.0d0.and.
. zzm.ge.zbmin.and.zzm.le.zbmax) then
call pabs_curr(i,j,k)
iiv(j,k)=i
else
if(iiv(j,k).gt.1) tauv(j,k,i)=tauv(j,k,i-1)
end if
if(tauv(j,k,i).le.taumn) taumn=tauv(j,k,i)
if(tauv(j,k,i).ge.taumx) taumx=tauv(j,k,i)
pabstot=pabstot+ppabs(j,k,iiv(j,k))
currtot=currtot+ccci(j,k,iiv(j,k))
end if
call print_output(i,j,k)
if(i.gt.1.and.psinv.ge.0.and.psinv.lt.psdbnd)
. iop(j,k)=1
if(iop(j,k).eq.1.and.
. (psinv.ge.psdbnd.or.
. (psinv.lt.1.0d0.and.(zzm.lt.zbmin.or.zzm.gt.zbmax))))
. iop(j,k)=2
c iov=0 initially, iov=1 first entrance in plasma,
c iov=2 first exit from plasma, iov=3 after 2nd entrance into plasma
if(index_rt.eq.1) then
if(j.eq.1) then
psinv11=psinv
if(ipolc.eq.0.and.iop(j,k).eq.1) then
call pol_limit(qqin,uuin,vvin)
ipolc=1
qqa=cos(2.0d0*psipol0*cvdr)*cos(2.0d0*chipol0*cvdr)
uua=sin(2.0d0*psipol0*cvdr)*cos(2.0d0*chipol0*cvdr)
vva=sin(2.0d0*chipol0*cvdr)
powa=0.5d0*(1.0d0+vva*vvin+uua*uuin+qqa*qqin)
c p0mw=p0mw*powa
c print*,' '
c print*,'Coupled power fraction =',powa
c print*,' '
c print*,'Input coupled power (MW) =',p0mw
c print*,' '
end if
if (iop(j,k).eq.2.and.rrm.le.rcen.and.ipass.gt.1
. .and.ipolc.eq.1) then
call pol_limit(qqout,uuout,vvout)
ipolc=2
call wall_refl(xvrfl,anvrfl,qqrfl,uurfl,vvrfl,irfl)
strfl11=i*dst+dstvac
call pol_limit(qqin2,uuin2,vvin2)
if(irfl.gt.0) then
powrfl=0.5d0*(1.0d0+vvrfl*vvin2+uurfl*uuin2+qqrfl*qqin2)
else
powrfl=0.5d0*(1.0d0+vvout*vvin2+uuout*uuin2+qqout*qqin2)
end if
write(6,*) 'Reflected power fraction =',powrfl
iop(j,k)=3
yyrfl(j,k,1)=xvrfl(1)
yyrfl(j,k,2)=xvrfl(2)
yyrfl(j,k,3)=xvrfl(3)
yyrfl(j,k,4)=anvrfl(1)
yyrfl(j,k,5)=anvrfl(2)
yyrfl(j,k,6)=anvrfl(3)
tau1v(j,k)=tauv(j,k,iiv(j,k))
end if
else
if(iop(j,k).eq.2.and.rrm.le.rcen.and.ipass.gt.1) then
call wall_refl(xvrfl,anvrfl,qqrfl,uurfl,vvrfl,irfl)
iop(j,k)=3
yyrfl(j,k,1)=xvrfl(1)
yyrfl(j,k,2)=xvrfl(2)
yyrfl(j,k,3)=xvrfl(3)
yyrfl(j,k,4)=anvrfl(1)
yyrfl(j,k,5)=anvrfl(2)
yyrfl(j,k,6)=anvrfl(3)
tau1v(j,k)=tauv(j,k,iiv(j,k))
end if
end if
end if
if(iop(j,k).lt.iopmin) iopmin=iop(j,k)
end do
end do
if(iwarm.gt.0.and.taumn.lt.1d+30.and.taumn.gt.taucr) istop=1
psimin=psjki(1,1,i)
if(nrayr.gt.1)
. psimin=min(psimin,minval(psjki(2:nrayr,1:nrayth,i)))
if(psimin.gt.1.0d0.and.rrm11.gt.rcen.and.index_rt.gt.1)
. istop=1
if(rrm11.lt.rwallm.and.ipass.eq.1) istop=1
if(iopmin.eq.2.and.ipass.eq.1) istop=1
if(iopmin.eq.3) istop=1
c print ray positions for j=nrayr in local reference system
istpr=istpr+1
if (istpr.eq.istpr0) then
c print*,'istep = ',i
if(nrayr.gt.1) then
iproj=0
nfilp=8
call projxyzt(iproj,nfilp)
end if
istpr=0
end if
c
if (istpl.eq.istpl0) istpl=0
istpl=istpl+1
return
end
c
c
c
subroutine print_output(i,j,k)
implicit real*8 (a-h,o-z)
parameter(ndim=6,jmx=31,kmx=36,nmx=8000)
parameter(taucr=12.0d0)
parameter(pi=3.14159265358979d0)
dimension ywrk(ndim,jmx,kmx),ypwrk(ndim,jmx,kmx)
dimension psjki(jmx,kmx,nmx)
dimension tauv(jmx,kmx,nmx),alphav(jmx,kmx,nmx)
dimension pdjki(jmx,kmx,nmx),ppabs(jmx,kmx,nmx)
dimension currj(jmx,kmx,nmx),didst(jmx,kmx,nmx),ccci(jmx,kmx,nmx)
dimension q(jmx),tau1v(jmx,kmx)
complex*16 ex,ey,ez
c
common/psjki/psjki
common/atjki/tauv,alphav
common/dpjjki/pdjki,currj
common/pcjki/ppabs,ccci
common/dcjki/didst
common/nhn/nhn
common/iokh/iohkawa
common/p0/p0mw
common/tau1v/tau1v
common/qw/q
common/index_rt/index_rt
common/ss/st
common/nray/nrayr,nrayth
common/istgr/istpr,istpl
common/ist/istpr0,istpl0
common/iieq/iequil
c
common/parpl/brr,bphi,bzz,ajphi
common/btot/btot
common/xgxg/xg
common/ygyg/yg
common/dens/dens,ddens
common/tete/tekev
common/absor/alpha,effjcd,akim,tau0
common/densbnd/psdbnd
common/epolar/ex,ey,ez
c
common/nplr/anpl,anpr
common/ddd/ddr,an2s,an2,fdia,bdotgr,ddi,ddr11
common/nprw/anprr,anpri
c
common/wrk/ywrk,ypwrk
c
x=ywrk(1,j,k)
y=ywrk(2,j,k)
z=ywrk(3,j,k)
rr=sqrt(x*x+y*y)
c
anx=ywrk(4,j,k)
any=ywrk(5,j,k)
anz=ywrk(6,j,k)
anr=(anx*x+any*y)/rr
anphi=(any*x-anx*y)/rr
c cnphi=(any*x-anx*y)
c
rrm=rr*1.0d-2
zzm=z*1.0d-2
stm=st*1.0d-2
xxm=x*1.0d-2
yym=y*1.0d-2
c
if(index_rt.gt.1) then
taujk=tauv(j,k,i)+tau1v(j,k)
else
taujk=tauv(j,k,i)
end if
c central ray only begin
if(j.eq.1) then
phi=acos(x/sqrt(y*y+x*x))
if(y.lt.0.0d0) phi=-phi
phideg=phi*180.0d0/pi
psi=psjki(j,k,i)
rhot=1.0d0
bbr=0.0d0
bbz=0.0d0
bpol=0.0d0
rhot=1.0d0
dens11=0.0d0
if(psi.ge.0.0d0) then
if(iequil.eq.2) then
if (psi.le.1.0d0) rhot=frhotor(psi)
bbr=brr
bbz=bzz
bpol=sqrt(bbr**2+bbz**2)
else
rhot=sqrt(psi)
end if
else
tekev=0.0d0
akim=0.0d0
end if
ddr11=ddr
c cutoff=xg-(1-yg)*(1-anpl**2)
c print dIds in A/m/W, Jphi and Jt in MA/m2, ki in m^-1
if(psi.le.psdbnd.and.psi.ge.0.0d0) dens11=dens
dids11=didst(j,k,i)*1.0d2/(p0mw*q(j))
dpdv11=pdjki(j,k,i)/(p0mw*q(j))
ajcd11=currj(j,k,i)/(p0mw*q(j))
alpha11=alphav(j,k,i)
tau11=taujk
pt11=exp(-taujk)
write(4,99) stm,rrm,zzm,phideg,
. psi,rhot,dens11,tekev,
. bbr,bphi,bbz,ajphi*1.0d-6,sqrt(an2),anpl,akim*100,
. alpha11,tau11,pt11,ajcd11,dids11,
. dble(nhn),dble(iohkawa),dble(index_rt)
c call polarcold(exf,eyif,ezf,elf,etf)
end if
c central ray only end
if(k.eq.1.and.j.eq.nrayr) write(17,99) st,ddr11,ddr,ddi
c print dIds in MA/m, Jcd in MA/m^2, ppabs and pdjki in MW/m^3
if(istpl.eq.istpl0) then
if(j.eq.nrayr.and.tauv(j,k,i).le.taucr) then
write(33,111) i,j,k,stm,xxm,yym,rrm,zzm,
. psjki(j,k,i),taujk,anpl,alphav(j,k,i),dble(index_rt)
end if
c if(k.eq.nrayth) write(33,*) ' '
end if
c
return
99 format(30(1x,e16.8e3))
111 format(3i5,16(1x,e16.8e3))
end
c
c
c
subroutine prfile
implicit none
integer*4 index_rt
common/index_rt/index_rt
If(index_rt.eq.1) then
write(4,*)' #sst R z phi psi rhot ne Te Br Bphi Bz Jphi '//
.'N Npl ki alpha tau Pt Jcd dIds nh iohkw index_rt'
write(8,*) ' #istep j k xt yt zt rt psin'
write(9,*) ' #istep j k xt yt zt rt psin'
write(17,*) ' #sst Dr_11 Dr_Nr1 Di_Nr1'
write(33,*) ' #i j k sst x y R z psi tauv Npl alpha index_rt'
write(12,*) ' #i sst psi w1 w2'
write(7,*)'#Icd Pa Jphimx dPdVmx '//
.'rhotj rhotjava rhotp rhotpav '//
.'drhotjava drhotpav ratjbmx stmx psipol chipol index_rt'
write(48,*) '#psi rhot Jphi Jcdb dPdV Icdins Pins P% index_rt'
else
c If(index_rt.eq.3) then
write(4,*) ' '
write(8,*) ' '
write(9,*) ' '
write(17,*) ' '
write(12,*) ' '
write(48,*) ' '
c end if
end if
return
end
c
c
c
subroutine read_data
use green_func_p, only:Setup_SpitzFunc
implicit real*8 (a-h,o-z)
real*8 me
character*8 wdat
character*10 wtim
character*24 filenmeqq,filenmprf,filenmbm
parameter(qe=4.8032d-10,me=9.1095d-28,vc=2.9979d+10)
parameter(pi=3.14159265358979d0,cvdr=pi/180.0d0)
parameter(nmx=8000,nbb=1000)
real*8 rlim(nbb),zlim(nbb)
c
common/xgcn/xgcn
common/ipec/ipec,nnd
common/nstep/nstep
common/ibeam/ibeam
common/ist/istpr0,istpl0
common/warm/iwarm,ilarm
common/ieccd/ieccd
common/idst/idst
c
common/filesn/filenmeqq,filenmprf,filenmbm
c
common/nray/nrayr,nrayth
common/rwmax/rwmax
common/dsds/dst
common/igrad/igrad
common/ipass/ipass
common/rwallm/rwallm
common/limiter/rlim,zlim,nlim
common/iieq/iequil
common/icocos/icocos
common/ixp/ixp
common/ipsn/ipsinorm
common/sspl/sspl
common/iipr/iprof
common/factb/factb
common/facttn/factt,factn
common/cent/btrcen,rcen
c
common/parwv/ak0,akinv,fhz
common/parbeam/wcsi,weta,rcicsi,rcieta,phiw,phir
common/anic/anx0c,any0c,anz0c
common/mirr/x00,y00,z00
common/pol0/psipol0,chipol0
c
common/pardens/dens0,aln1,aln2
common/parban/b0,rr0m,zr0m,rpam
common/parqq/q0,qa,alq
common/parqte/te0,dte0,alt1,alt2
common/zz/Zeff
c
common/parbres/bres
common/densbnd/psdbnd
common/nfile/neqdsk,nprof
common/sgnib/sgnbphi,sgniphi
common/p0/p0mw
c
common/mode/sox
common/angles/alpha0,beta0
common/scal/iscal
c
open(2,file='gray.data',status= 'unknown')
c
c alpha0, beta0 (cartesian) launching angles
c fghz wave frequency (GHz)
c p0mw injected power (MW)
c
read(2,*) alpha0,beta0
read(2,*) fghz
read(2,*) p0mw
c
c nrayr number of rays in radial direction
c nrayth number of rays in angular direction
c rwmax normalized maximum radius of beam power
c rwmax=1 -> last ray at radius = waist
c
read(2,*) nrayr,nrayth,rwmax
if(nrayr.eq.1) nrayth=1
c
c x00,y00,z00 coordinates of launching point
c
read(2,*) x00,y00,z00
c
c beams parameters in local reference system
c w0 -> waist, d0 -> waist distance from launching point
c phiw angle of beam ellipse
c
read(2,*) w0csi,w0eta,d0csi,d0eta,phiw
c
c ibeam=0 :read data for beam as above
c ibeam=1 :read data from file simple astigmatic beam
c ibeam=2 :read data from file general astigmatic beam
read(2,*) ibeam
read(2,*) filenmbm
c
c iequil=0 :vacuum
c iequil=1 :analytical equilibrium
c iequil=2 :read eqdsk
c ixp=0,-1,+1 : no X point , bottom/up X point
c
read(2,*) iequil,ixp
c
c iprof=0 :analytical density and temp. profiles
c iprof>0 :numerical density and temp. profiles
c
read(2,*) iprof
c
c iwarm=0 :no absorption and cd
c iwarm=1 :weakly relativistic absorption
c iwarm=2 :relativistic absorption, n<1 asymptotic expansion
c iwarm=3 :relativistic absorption, numerical integration
c ilarm :order of larmor expansion
c
read(2,*) iwarm,ilarm
c if(iwarm.gt.2) iwarm=2
c
c ieccd 0/1 NO/YES ECCD calculation ieccd>0 different CD models
c
read(2,*) ieccd
if (ieccd.ge.10) call Setup_SpitzFunc
c
c ipec=0/1 :pec profiles grid in psi/rhop
c nnd :number of grid steps for pec profiles +1
c
read(2,*) ipec,nnd
c
c dst integration step
c nstep maximum number of integration steps
c istpr0 projection step = dsdt*istprj
c istpl0 plot step = dsdt*istpl
c igrad=0 optical ray-tracing, initial conditions as for beam
c igrad=1 quasi-optical ray-tracing
c igrad=-1 ray-tracing, init. condit.
c from center of mirror and with angular spread
c ipass=1/2 1 or 2 passes into plasma
c iox=1/2 OM/XM
c idst=0/1/2 0 integration in s, 1 integr. in ct, 2 integr. in Sr
c
read(2,*) dst,nstep,istpr0,istpl0,idst
read(2,*) igrad,ipass,rwallm
read(2,*) iox, psipol0,chipol0
c
c ipsinorm 0 standard EQDSK format, 1 format Portone summer 2004
c sspl spline parameter for psi interpolation
c
read(2,*) filenmeqq
read(2,*) ipsinorm,sspl
c
c factb factor for magnetic field (only for numerical equil)
c scaling adopted: beta=const, qpsi=const, nustar=const
c iscal ne Te scaling 0: nustar=const, 1: n_greenw=const; 2 no rescaling
c factT factn factor for Te&ne scaling
c
read(2,*) factb, iscal,factt,factn
if (factb.eq.0.0d0) factb=1.0d0
c
c psbnd value of psi ( > 1 ) of density boundary
c
read(2,*) filenmprf
read(2,*) psdbnd
if(iprof.eq.0) psdbnd=1.0d0
c
c signum of toroidal B and I
c icocos index for equilibrium from COCOS - O. Sauter Feb 2012
read(2,*) sgnbphi,sgniphi,icocos
c
c read parameters for analytical density and temperature
c profiles if iprof=0
c
if(iprof.eq.0) then
read(2,*) dens0,aln1,aln2
read(2,*) te0,dte0,alt1,alt2
else
read(2,*) dummy,dummy,dummy
read(2,*) dummy,dummy,dummy,dummy
end if
read(2,*) zeff
c
c read parameters for analytical simple cylindical equilibrium
c if iequil=0,1
if(iequil.lt.2) then
read(2,*) rr0,zr0,rpa
read(2,*) b0
read(2,*) q0,qa,alq
rr0m=rr0/1.0d2
zr0m=zr0/1.0d2
rpam=rpa/1.0d2
else
read(2,*) dummy,dummy,dummy
read(2,*) dummy
read(2,*) dummy,dummy,dummy
end if
c
close(unit=2)
c
if(nrayr.eq.1) igrad=0
if (nrayr.lt.5) then
igrad=0
print*,' nrayr < 5 ! => OPTICAL CASE ONLY'
print*,' '
end if
c
fhz=fghz*1.0d9
ak0=2.0d9*pi*fghz/vc
akinv=1.0d0/ak0
c
bresg=2.0d0*pi*fhz*me*vc/qe
bres=bresg*1.0d-4
c
c xg=xgcn*dens19
c
xgcn=1.0d-5*qe**2/(pi*me*fghz**2)
c
sox=-1.0d0
if(iox.eq.2) sox=1.0d0
c
c read data for beam from file if ibeam>0
c
if(ibeam.gt.0) then
call read_beams
else
zrcsi=0.5d0*ak0*w0csi**2
zreta=0.5d0*ak0*w0eta**2
if(igrad.gt.0) then
wcsi=w0csi*sqrt(1.0d0+(d0csi/zrcsi)**2)
weta=w0eta*sqrt(1.0d0+(d0eta/zreta)**2)
rcicsi=-d0csi/(d0csi**2+zrcsi**2)
rcieta=-d0eta/(d0eta**2+zreta**2)
phir=phiw
else
d0eta=d0csi
wcsi=w0csi*abs(d0csi/zrcsi)
weta=w0eta*abs(d0eta/zreta)
rcicsi=w0csi/zrcsi
rcieta=w0eta/zreta
if(d0csi.gt.0) then
rcicsi=-rcicsi
rcieta=-rcieta
end if
phir=phiw
end if
end if
c
print'(a,2f8.3)','alpha0, beta0 = ',alpha0,beta0
c
r00=sqrt(x00**2+y00**2)
phi0=acos(x00/r00)
if(y00.lt.0) phi0=-phi0
print'(a,4f8.3)','x00, y00, R00, z00 = ',x00,y00,r00,z00
print*,' '
c
c anx0c=(anr0c*x00-anphi0c*y00)/r00
c any0c=(anr0c*y00+anphi0c*x00)/r00
c
c anr0c=(anx0c*x00+any0c*y00)/r00
c anphi0c=(any0c*x00-anx0c*y00)/r00
c
c angles alpha0, beta0 in a local reference system as proposed by Gribov et al
c
c anr0c=-cos(cvdr*beta0)*cos(cvdr*alpha0)
c anphi0c=sin(cvdr*beta0)
c anz0c=-cos(cvdr*beta0)*sin(cvdr*alpha0)
anr0c=-cos(cvdr*beta0)*cos(cvdr*alpha0)
anphi0c=sin(cvdr*beta0)
anz0c=-cos(cvdr*beta0)*sin(cvdr*alpha0)
anx0c=(anr0c*x00-anphi0c*y00)/r00
any0c=(anr0c*y00+anphi0c*x00)/r00
c
c read data for Te , ne , Zeff from file if iprof>0
c
if (iprof.eq.1) then
nprof=98
lprf=length(filenmprf)
open(file=filenmprf(1:lprf)//'.prf',
. status= 'unknown',unit=nprof)
call profdata
close(nprof)
end if
c
c read equilibrium data from file if iequil=2
c
if (iequil.eq.2) then
neqdsk=99
leqq=length(filenmeqq)
open(file=filenmeqq(1:leqq)//'.eqdsk',
. status= 'unknown', unit=neqdsk)
call equidata
close(neqdsk)
c print density, temperature, safecty factor, toroidal current dens
c versus psi, rhop, rhot
call print_prof
end if
if (iequil.eq.1) call surf_anal
if (iequil.ne.2.or.ipass.lt.0) then
c set simple limiter as two cylindrical walls at rwallm and r00
nlim=5
rlim(1)=rwallm
rlim(2)=r00*1.d-2
rlim(3)=rlim(2)
rlim(4)=rlim(1)
rlim(5)=rlim(1)
zlim(1)=-dst*nmx*1.d-2
zlim(2)=zlim(1)
zlim(3)=dst*nmx*1.d-2
zlim(4)=zlim(3)
zlim(5)=zlim(1)
ipass=abs(ipass)
end if
nfil=78
open(nfil,file='headers.txt',status= 'unknown')
call date_and_time(wdat,wtim)
write(nfil,916) wdat(1:4),wdat(5:6),wdat(7:8),
. wtim(1:2),wtim(3:4),wtim(5:6)
write(nfil,904) REVISION
if (iequil.eq.2) then
write(nfil,905) filenmeqq
else
if (iequil.eq.1) write(nfil,912) rr0,zr0,rpa,B0,q0,qa,alq
if (iequil.eq.0) write(nfil,'("# VACUUM CASE")')
end if
if (iprof.eq.1) then
write(nfil,907) filenmprf
else
write(nfil,913) dens0,aln1,aln2,te0,dte0,alt1,alt2,zeff
end if
write(nfil,911) fghz,p0mw,iox
write(nfil,902) x00,y00,z00
write(nfil,908) alpha0,beta0
if(ibeam.ge.1) write(nfil,909) filenmbm
if(ibeam.eq.0) write(nfil,903) w0csi,w0eta,d0csi,d0eta,phiw
write(nfil,900) nrayr, nrayth, rwmax
write(nfil,901) igrad,iwarm,ilarm,ieccd,idst
write(nfil,915) dst,nstep
write(nfil,914) sgnbphi,sgniphi,icocos
write(nfil,906) factb,factt,factn,iscal
write(nfil,910) sspl,psdbnd,nnd,ipec,ipsinorm
write(nfil,*) ' '
close(nfil)
return
900 format('# Nray_r Nray_th rwmax : ',2i5,1x,es12.5)
901 format('# igrad iwarm ilarm ieccd idst : ',6i5)
902 format('# X0 Y0 Z0 launching point (cm) : ',3(1x,es12.5))
903 format('# w0xi w0eta d0xi d0eta (cm) phiw (deg) : ',5(1x,es12.5))
904 format('# GRAY revision : ',a)
905 format('# EQUILIBRIUM file : ',a24)
906 format('# fact_B fact_T fact_n iscal : ',(3(1x,es12.5),i5))
907 format('# PROFILES file : ',a24)
908 format('# alpha0 beta0 launch angles (deg) CYL : ',2(1x,es12.5))
909 format('# LAUNCHER file : ',a24)
910 format('# sspl psdbnd nd ipec ipsinorm : ',2(1x,es12.5),3i5)
911 format('# fghz P0 IOX : ',2(1x,es12.5),i5)
912 format('# AN. EQUILIBRIUM R0 z0 a B0 q0 qa alq : ',7(1x,es12.5))
913 format('# AN. PROFILES ne0 aln1 aln2 Te0 Tea alt1 alt2 Zeff : '
. ,8(1x,es12.5))
914 format('# sgnB_phi sgnI_phi icocos : ',2(1x,es12.5),i5)
915 format('# dst nstep : ',1x,es12.5,i5)
916 format('# Date : ',a4,2('/',a2),1x,a2,2(':',a2))
99 format(20(1x,e16.8e3))
end
c
c
c
subroutine surf_anal
implicit real*8(a-h,o-z)
parameter(pi=3.14159265358979d0)
common/parban/b0,rr0m,zr0m,rpam
common/parbres/bres
c
c print circular magnetic surfaces iequil=1
c
write(71,*) '#i psin R z'
dal=2.0d-2*pi
drn=0.1d0
do i=1,10
rni=i*drn
do k=1,101
drrm=rpam*rni*cos((k-1)*dal)
dzzm=rpam*rni*sin((k-1)*dal)
rrm=rr0m+drrm
zzm=zr0m+dzzm
write(71,111) i,rni,rrm,zzm
end do
write(71,*) ' '
write(71,*) ' '
end do
c
c print resonant B iequil=1
c
write(70,*)'#i Btot R z'
rres=b0*rr0m/bres
zmx=zr0m+rpam
zmn=zr0m-rpam
do i=1,21
zzres=zmn+(i-1)*(zmx-zmn)/2.0d1
write(70,111) i,bres,rres,zzres
end do
return
111 format(i4,20(1x,e16.8e3))
end
c
c
subroutine read_beams
implicit real*8(a-h,o-z)
character*24 filenmeqq,filenmprf,filenmbm
parameter(nstrmx=50)
c
dimension alphastv(nstrmx),betastv(nstrmx),cbeta(nstrmx,4)
dimension x00v(nstrmx),y00v(nstrmx),z00v(nstrmx)
dimension cx0(nstrmx,4),cy0(nstrmx,4),cz0(nstrmx,4)
dimension waist1v(nstrmx),waist2v(nstrmx)
dimension rci1v(nstrmx),rci2v(nstrmx)
dimension cwaist1(nstrmx,4),cwaist2(nstrmx,4)
dimension crci1(nstrmx,4),crci2(nstrmx,4)
dimension phi1v(nstrmx),phi2v(nstrmx)
dimension cphi1(nstrmx,4),cphi2(nstrmx,4)
c
common/ibeam/ibeam
common/filesn/filenmeqq,filenmprf,filenmbm
common/parbeam/wcsi,weta,rcicsi,rcieta,phiw,phir
common/mirr/x00,y00,z00
common/angles/alpha0,beta0
common/parwv/ak0,akinv,fhz
c
c for given alpha0 -> beta0 + beam parameters
c
c ibeam=1 simple astigmatic beam
c ibeam=2 general astigmatic beam
c
c initial beam data are measured in mm -> transformed to cm
c
nfbeam=97
lbm=length(filenmbm)
open(file=filenmbm(1:lbm)//'.txt',status= 'unknown',unit=nfbeam)
c
read(nfbeam,*) nisteer
do i=1,nisteer
if(ibeam.eq.1) then
read(nfbeam,*) steer,alphast,betast,x00mm,y00mm,z00mm,
. waist1,dvir1,waist2,dvir2,delta
phi1=delta
phi2=delta
zr1=0.5d-1*ak0*waist1**2
zr2=0.5d-1*ak0*waist2**2
w1=waist1*sqrt(1.0d0+(dvir1/zr1)**2)
w2=waist2*sqrt(1.0d0+(dvir2/zr2)**2)
rci1=-dvir1/(dvir1**2+zr1**2)
rci2=-dvir2/(dvir2**2+zr2**2)
else
read(nfbeam,*) steer,alphast,betast,x00mm,y00mm,z00mm,
. w1,w2,rci1,rci2,phi1,phi2
end if
x00v(i)=0.1d0*x00mm
y00v(i)=0.1d0*y00mm
z00v(i)=0.1d0*z00mm
alphastv(i)=alphast
betastv(i)=betast
waist1v(i)=0.1d0*w1
rci1v(i)=1.0d1*rci1
waist2v(i)=0.1d0*w2
rci2v(i)=1.0d1*rci2
phi1v(i)=phi1
phi2v(i)=phi2
end do
c
iopt=0
call difcs(alphastv,betastv,nisteer,iopt,cbeta,ier)
call difcs(alphastv,waist1v,nisteer,iopt,cwaist1,ier)
call difcs(alphastv,rci1v,nisteer,iopt,crci1,ier)
call difcs(alphastv,waist2v,nisteer,iopt,cwaist2,ier)
call difcs(alphastv,rci2v,nisteer,iopt,crci2,ier)
call difcs(alphastv,phi1v,nisteer,iopt,cphi1,ier)
call difcs(alphastv,phi2v,nisteer,iopt,cphi2,ier)
call difcs(alphastv,x00v,nisteer,iopt,cx0,ier)
call difcs(alphastv,y00v,nisteer,iopt,cy0,ier)
call difcs(alphastv,z00v,nisteer,iopt,cz0,ier)
c
if(alpha0.gt.alphastv(1).and.alpha0.lt.alphastv(nisteer)) then
call locate(alphastv,nisteer,alpha0,k)
dal=alpha0-alphastv(k)
betst=spli(cbeta,nisteer,k,dal)
x00=spli(cx0,nisteer,k,dal)
y00=spli(cy0,nisteer,k,dal)
z00=spli(cz0,nisteer,k,dal)
wcsi=spli(cwaist1,nisteer,k,dal)
weta=spli(cwaist2,nisteer,k,dal)
rcicsi=spli(crci1,nisteer,k,dal)
rcieta=spli(crci2,nisteer,k,dal)
phiw=spli(cphi1,nisteer,k,dal)
phir=spli(cphi2,nisteer,k,dal)
else
print*,' alpha0 outside table range !!!'
if(alpha0.ge.alphastv(nisteer)) ii=nisteer
if(alpha0.le.alphastv(1)) ii=1
betst=betastv(ii)
x00=x00v(ii)
y00=y00v(ii)
z00=z00v(ii)
wcsi=waist1v(ii)
weta=waist2v(ii)
rcicsi=rci1v(ii)
rcieta=rci2v(ii)
phiw=phi1v(ii)
phir=phi2v(ii)
end if
beta0=betst
c
close(nfbeam)
c
return
end
c
c
c
subroutine equidata
implicit real*8 (a-h,o-z)
parameter(nnw=501,nnh=501)
parameter(pi=3.14159265358979d0)
parameter(nbb=1000)
c parameter(np=100)
character*48 stringa
dimension fpol(nnw),pres(nnw),qpsi(nnw)
dimension ffprim(nnw),pprim(nnw)
dimension psi(nnw,nnh),rv(nnw),zv(nnh),psin(nnw,nnh),psinr(nnw)
dimension rbbbs(nbb),zbbbs(nbb)
dimension rlim(nbb),zlim(nbb)
c dimension rcon(2*np+1),zcon(2*np+1)
c
parameter(nrest=nnw+4,nzest=nnh+4)
parameter(lwrk=4*(nnw+nnh)+11*(nrest+nzest)+nrest*nnh+nzest+54)
parameter(liwrk=nnh+nnw+nrest+nzest+3,kspl=3)
dimension fvpsi(nnw*nnh),cc(nnw*nnh),ffvpsi(nnw*nnh)
dimension tr(nrest),tz(nzest),wrk(lwrk),iwrk(liwrk)
parameter(lwrkbsp=4*(nnw+nnh),liwrkbsp=nnw+nnh)
dimension wrkbsp(lwrkbsp),iwrkbsp(liwrkbsp)
parameter(lw10=nnw*3+nnh*4+nnw*nnh,lw01=nnw*4+nnh*3+nnw*nnh)
parameter(lw20=nnw*2+nnh*4+nnw*nnh,lw02=nnw*4+nnh*2+nnw*nnh)
parameter(lw11=nnw*3+nnh*3+nnw*nnh,ldiwrk=nnw+nnh)
dimension cc01(lw01),cc10(lw10),cc02(lw02),cc20(lw20),cc11(lw11)
dimension iwrkd(ldiwrk)
parameter(lwrkf=nnw*4+nrest*16)
dimension tfp(nrest),cfp(nrest),wrkf(lwrkf),iwrkf(nrest),wf(nnw)
dimension fpoli(nnw)
c
common/pareq1/psia
common/pareq1t/psiant,psinop
common/cent/btrcen,rcen
common/pareq2/btaxis,rmaxis,zmaxis,rmnm,rmxm,zmnm,zmxm,dr,dz
common/psinr/psinr
common/qpsi/qpsi
common/cpsin/rv,zv,psin
common/cpsi/psi
common/eqnn/nr,nz,npp,nintp
common/ipsn/ipsinorm
common/sspl/sspl
common/nfile/neqdsk,nprof
common/bound/zbmin,zbmax
common/sgnib/sgnbphi,sgniphi
common/factb/factb
common/ixp/ixp
common/icocos/icocos
common/coffeqt/tr,tz
common/coffeqtp/tfp
common/coffeq/cc
common/coffeqd/cc01,cc10,cc20,cc02,cc11
common/coffeqn/nsrt,nszt,nsft
common/cofffp/cfp
common/fpas/fpolas
common/rhotsx/rhotsx
common/rrtor/rrtor
common/cnt/rup,zup,rlw,zlw
common/limiter/rlim,zlim,nlim
c
c read from file eqdsk
c (see http://fusion.gat.com/efit/g_eqdsk.html)
c
c spline interpolation of psi and derivatives
c
if(icocos.gt.0) then
read (neqdsk,'(a48,3i4)') stringa,idum,nr,nz
else
read (neqdsk,*) nr,nz
end if
if(ipsinorm.eq.0) then
read (neqdsk,2020) drnr1,dznz1,rcen,rleft,zmid
read (neqdsk,2020) rmaxis,zmaxis,psiaxis,psiedge,btrcen
read (neqdsk,2020) current,xdum,xdum,xdum,xdum
read (neqdsk,2020) xdum,xdum,xdum,xdum,xdum
read (neqdsk,2020) (fpol(i),i=1,nr)
read (neqdsk,2020) (pres(i),i=1,nr)
read (neqdsk,2020) (ffprim(i),i=1,nr)
read (neqdsk,2020) (pprim(i),i=1,nr)
read (neqdsk,2020) ((psi(i,j),i=1,nr),j=1,nz)
read (neqdsk,2020) (qpsi(i),i=1,nr)
else
read (neqdsk,*) drnr1,dznz1,rcen,rleft,zmid
read (neqdsk,*) rmaxis,zmaxis,psiaxis,psiedge,btrcen
read (neqdsk,*) current,xdum,xdum,xdum,xdum
read (neqdsk,*) xdum,xdum,xdum,xdum,xdum
read (neqdsk,*) (fpol(i),i=1,nr)
read (neqdsk,*) (pres(i),i=1,nr)
read (neqdsk,*) (ffprim(i),i=1,nr)
read (neqdsk,*) (pprim(i),i=1,nr)
read (neqdsk,*) ((psin(i,j),i=1,nr),j=1,nz)
read (neqdsk,*) (qpsi(i),i=1,nr)
end if
2020 format (5e16.9)
c
c compensate for different reference systems
c
icocosmod=mod(icocos,10)
if (mod(icocos,2).eq.0.and.icocosmod.gt.0) then
c icocos mod 2 = 0: toroidal angle phi CW (opposite to gray convention)
btrcen=-btrcen
current=-current
do i=1,nr
fpol(i)=-fpol(i)
end do
end if
c
if (icocosmod.eq.1 .or. icocosmod.eq.4 .or.
& icocosmod.eq.5 .or. icocosmod.eq.8) then
c icocos mod 10 = 1,4,5,8: psi increasing with CCW Ip
c icocos mod 10 = 2,3,6,7: psi decreasing with CCW Ip
psiedge=-psiedge
psiaxis=-psiaxis
if (ipsinorm.eq.0) then
do j=1,nz
do i=1,nr
psi(i,j)=-psi(i,j)
end do
end do
end if
end if
c
c add check for Ip/psi and B0/Fpol sign consistency?
c
current=sign(current,psiax-psiedge)
btrcen=sign(btrcen,fpol(nr))
c
c length in m !!!
c
dr=drnr1/dble(nr-1)
dz=dznz1/dble(nz-1)
rv(1)=rleft
zv(1)=zmid-dznz1/2.0d0
dpsinr=1.0d0/dble(nr-1)
c
do i=1,nr
psinr(i)=(i-1)*dpsinr
rv(i)=rv(1)+(i-1)*dr
end do
c
do j=1,nz
zv(j)=zv(1)+(j-1)*dz
end do
c
rmnm=rv(1)
rmxm=rv(nr)
zmnm=zv(1)
zmxm=zv(nz)
c psi function
psia0=psiedge-psiaxis
c icocos=0: adapt psi to force Ip sign, otherwise maintain psi
if (icocosmod.ne.0) sgniphi=sign(1.0d0,-psia0)
current=sign(current,sgniphi)
psia=-sgniphi*abs(psia0)*factb
c icocos>10: input psi is in Wb
c icocos<10: input psi is in Wb/rad (gray convention)
if (icocos.ge.10) psia=psia/(2.0d0*pi)
c
c do j=1,nz
c do i=1,nr
c write(80,2021) rv(i),zv(j),psi(i,j)
c enddo
c write(80,*) ' '
c enddo
do j=1,nz
do i=1,nr
if(ipsinorm.eq.0) then
psin(i,j)=(psi(i,j)-psiaxis)/(psia0)
psi(i,j)=psin(i,j)*psia
else
psi(i,j)=psin(i,j)*psia
end if
ij=nz*(i-1)+j
fvpsi(ij)=psin(i,j)
enddo
enddo
c
c spline fitting/interpolation of psin(i,j) and derivatives
c
iopt=0
call regrid(iopt,nr,rv,nz,zv,fvpsi,rmnm,rmxm,zmnm,zmxm,
. kspl,kspl,sspl,nrest,nzest,nsr,tr,nsz,tz,cc,fp,
. wrk,lwrk,iwrk,liwrk,ier)
c if ier=-1 data are fitted using sspl=0
if(ier.eq.-1) then
sspl=0.0d0
call regrid(iopt,nr,rv,nz,zv,fvpsi,rmnm,rmxm,zmnm,zmxm,
. kspl,kspl,sspl,nrest,nzest,nsr,tr,nsz,tz,cc,fp,
. wrk,lwrk,iwrk,liwrk,ier)
end if
nsrt=nsr
nszt=nsz
if (sspl.gt.0.0d0) then
call bispev(tr,nsr,tz,nsz,cc,kspl,kspl,rv,nr,zv,nz,ffvpsi,
. wrkbsp,lwrkbsp,iwrkbsp,liwrkbsp,ier)
c
do j=1,nz
do i=1,nr
ij=nz*(i-1)+j
psin(i,j)=ffvpsi(ij)
psi(i,j)=psin(i,j)*psia
c write(79,2021) rv(i),zv(j),psin(i,j)
enddo
c write(79,*) ' '
enddo
end if
2021 format(5(1x,e16.9))
c
nur=1
nuz=0
call parder(tr,nsr,tz,nsz,cc,kspl,kspl,nur,nuz,rv,nr,zv,nz,
. ffvpsi,cc10,lw10,iwrkd,ldiwrk,ier)
c
nur=0
nuz=1
call parder(tr,nsr,tz,nsz,cc,kspl,kspl,nur,nuz,rv,nr,zv,nz,
. ffvpsi,cc01,lw01,iwrkd,ldiwrk,ier)
c
nur=2
nuz=0
call parder(tr,nsr,tz,nsz,cc,kspl,kspl,nur,nuz,rv,nr,zv,nz,
. ffvpsi,cc20,lw20,iwrkd,ldiwrk,ier)
c
nur=0
nuz=2
call parder(tr,nsr,tz,nsz,cc,kspl,kspl,nur,nuz,rv,nr,zv,nz,
. ffvpsi,cc02,lw02,iwrkd,ldiwrk,ier)
c
nur=1
nuz=1
call parder(tr,nsr,tz,nsz,cc,kspl,kspl,nur,nuz,rv,nr,zv,nz,
. ffvpsi,cc11,lw11,iwrkd,ldiwrk,ier)
c
c scaling of f_poloidal
c
c icocos=0: adapt fpol to force Ip sign, otherwise maintain fpol
if (icocosmod.ne.0) sgnbphi=sign(1.0d0,fpol(nr))
btrcen=sign(btrcen,sgnbphi)
do i=1,nr
fpol(i)=sgnbphi*abs(fpol(i))*factb
wf(i)=1.0d0
end do
wf(nr)=1.0d2
c
c spline interpolation of fpol(i)
c
iopt=0
xb=0.0d0
xe=1.0d0
ssfp=0.01d0
call curfit(iopt,nr,psinr,fpol,wf,xb,xe,kspl,ssfp,nrest,nsft,
. tfp,cfp,fp,wrkf,lwrkf,iwrkf,ier)
c
call splev(tfp,nsft,cfp,3,psinr,fpoli,nr,ier)
fpolas=fpoli(nr)
c
c read plasma boundaries from eqdsk file
c
read (neqdsk,*) nbbbs,nlim
if(nbbbs.gt.0) then
if(ipsinorm.eq.1)
. read (neqdsk,*) (rbbbs(i),zbbbs(i),i=1,nbbbs)
if(ipsinorm.eq.0)
. read (neqdsk,2020) (rbbbs(i),zbbbs(i),i=1,nbbbs)
c do i=1,nbbbs
c write(51,*) rbbbs(i),zbbbs(i)
c end do
end if
if(nlim.gt.0) then
if(ipsinorm.eq.1)
. read (neqdsk,*) (rlim(i),zlim(i),i=1,nlim)
if(ipsinorm.eq.0)
. read (neqdsk,2020) (rlim(i),zlim(i),i=1,nlim)
end if
c
c compute max and min z of last closed surface
c
rbmin=rax
rbmax=rax
if (nbbbs.gt.1) then
zbmin=1.0d+30
zbmax=-1.0d+30
do i=1,nbbbs
if(zbbbs(i).le.zbmin) then
zbmin=zbbbs(i)
rbmin=rbbbs(i)
end if
if(zbbbs(i).ge.zbmax) then
zbmax=zbbbs(i)
rbmax=rbbbs(i)
end if
end do
else
zbmin=-1.0d+30
zbmax=1.0d+30
end if
if(zbmin.le.zmnm) zbmin=zbmin+dz
if(rbmin.le.rmnm) rbmin=rbmin+dr
if(zbmax.ge.zmxm) zbmax=zbmax-dz
if(rbmax.ge.rmxm) rbmax=rbmax-dr
c
c start with uncorrected normalized psi
c
psinop=0.0d0
psinxp=1.0d0
psiant=1.0d0
c
c search for O-point
c
call points_ox(rmaxis,zmaxis,rmop,zmop,psinoptmp,info)
rmaxis=rmop
zmaxis=zmop
print'(a,2f8.4,es12.5)','O-point',rmop,zmop,psinoptmp
c
c search for X-point if ixp not = 0
c
if(ixp.ne.0) then
if(ixp.lt.0) then
r10=rbmin
z10=zbmin
call points_ox(r10,z10,rxp,zxp,psinxptmp,info)
if(psinxp.ne.-1.0d0) then
print'(a,2f8.4,es12.5)','X-point',rxp,zxp,psinxptmp
rbmin=rxp
zbmin=zxp
psinop=psinoptmp
psinxp=psinxptmp
psiant=psinxp-psinop
psin1=1.0d0
r10=rmaxis
z10=(zbmax+zmaxis)/2.0d0
call points_tgo(r10,z10,r1,z1,psin1,info)
rbmax=r1
zbmax=z1
else
ixp=0
c print'(a)','no X-point'
end if
else
r10=rmop
z10=zbmax
call points_ox(r10,z10,rxp,zxp,psinxptmp,info)
if(psinxp.ne.-1.0d0) then
print'(a,2f8.4,e16.8)','X-point',rxp,zxp,psinxptmp
zbmax=zxp
psinop=psinoptmp
psinxp=psinxptmp
psiant=psinxp-psinop
psin1=1.0d0
z10=(zbmin+zmaxis)/2.0d0
call points_tgo(r10,z10,r1,z1,psin1,info)
zbmin=z1
else
ixp=0
c print'(a)','no X-point'
end if
end if
end if
c
if (ixp.eq.0) then
psin1=1.0d0
psinop=psinoptmp
psiant=psin1-psinop
r10=rmaxis
z10=(zbmax+zmaxis)/2.0d0
call points_tgo(r10,z10,r1,z1,psin1,info)
zbmax=z1
rbmax=r1
z10=(zbmin+zmaxis)/2.0d0
call points_tgo(r10,z10,r1,z1,psin1,info)
zbmin=z1
rbmin=r1
print'(a,4f8.4)','no X-point ',rbmin,zbmin,rbmax,zbmax
end if
print*,' '
c compute B_toroidal on axis
btaxis=fpol(1)/rmaxis
btrcen=abs(btrcen)*factb
print'(a,f8.4)','factb = ',factb
print'(a,f8.4)','|BT_centr|= ',btrcen
print'(a,f8.4)','|BT_axis| = ',abs(btaxis)
c compute normalized rho_tor from eqdsk q profile
call rhotor(nr)
c phitedge=abs(psia)*rhotsx*2*pi
c rrtor=sqrt(phitedge/abs(btrcen)/pi)
c compute flux surface averaged quantities
rup=rmaxis
rlw=rmaxis
zup=zmaxis+(zbmax-zmaxis)/10.0d0
zlw=zmaxis-(zmaxis-zbmin)/10.0d0
call flux_average
c ipr=1
c call contours_psi(1.0d0,np,rcon,zcon,ipr)
c do ii=1,2*np+1
c write(52,*) rcon(ii), zcon(ii)
c end do
c
c locate psi surface for q=1.5 and q=2
rup=rmaxis
rlw=rmaxis
zup=(zbmax+zmaxis)/2.0d0
zlw=(zmaxis+zbmin)/2.0d0
q2=2.0d0
q15=1.5d0
call vmaxmini(qpsi,nr,qmin,qmax,iqmn,iqmx)
if (q15.gt.qmin.and.q15.lt.qmax) then
call surfq(q15,psi15)
rhot15=frhotor(psi15)
print'(3(a,f8.5))','psi_1.5 = ',psi15,' rhop_1.5 = '
. ,sqrt(psi15),' rhot_1.5 = ',rhot15
end if
if (q2.gt.qmin.and.q2.lt.qmax) then
call surfq(q2,psi2)
rhot2=frhotor(psi2)
print'(3(a,f8.5))','psi_2 = ',psi2,' rhop_2 = '
. ,sqrt(psi2),' rhot_2 = ',rhot2
end if
c
c locate btot=bres
c
call bfield_res
c
return
end
c
c
c
subroutine points_ox(rz,zz,rf,zf,psinvf,info)
implicit real*8 (a-h,o-z)
parameter(n=2,ldfjac=n,lwa=(n*(n+13))/2)
dimension xvec(n),fvec(n),fjac(ldfjac,n),wa(lwa)
external fcnox
common/psival/psinv
xvec(1)=rz
xvec(2)=zz
tol = sqrt(dpmpar(1))
call hybrj1(fcnox,n,xvec,fvec,fjac,ldfjac,tol,info,wa,lwa)
if(info.gt.1) then
print'(a,i2,a,2f8.4)',' info subr points_ox =',info,
. ' O/X coord.',xvec
end if
rf=xvec(1)
zf=xvec(2)
psinvf=psinv
return
end
c
c
c
subroutine fcnox(n,x,fvec,fjac,ldfjac,iflag)
implicit real*8 (a-h,o-z)
dimension x(n),fvec(n),fjac(ldfjac,n)
common/derip/dpsidr,dpsidz,ddpsidrr,ddpsidzz,ddpsidrz,fpolv,ffpv
common/pareq1/psia
call equinum(x(1),x(2))
if (iflag.ne.2) then
fvec(1) = dpsidr/psia
fvec(2) = dpsidz/psia
else
fjac(1,1) = ddpsidrr/psia
fjac(1,2) = ddpsidrz/psia
fjac(2,1) = ddpsidrz/psia
fjac(2,2) = ddpsidzz/psia
end if
return
end
c
c
c
subroutine points_tgo(rz,zz,rf,zf,psin,info)
implicit real*8 (a-h,o-z)
parameter(n=2,ldfjac=n,lwa=(n*(n+13))/2)
dimension xvec(n),fvec(n),fjac(ldfjac,n),wa(lwa)
external fcntgo
common/cnpsi/h
h=psin
xvec(1)=rz
xvec(2)=zz
tol = sqrt(dpmpar(1))
call hybrj1(fcntgo,n,xvec,fvec,fjac,ldfjac,tol,info,wa,lwa)
if(info.gt.1) then
end if
rf=xvec(1)
zf=xvec(2)
return
end
c
c
c
subroutine fcntgo(n,x,fvec,fjac,ldfjac,iflag)
implicit real*8 (a-h,o-z)
dimension x(n),fvec(n),fjac(ldfjac,n)
common/derip/dpsidr,dpsidz,ddpsidrr,ddpsidzz,ddpsidrz,fpolv,ffpv
common/psival/psinv
common/cnpsi/h
common/pareq1/psia
call equinum(x(1),x(2))
if (iflag.ne.2) then
fvec(1) = psinv-h
fvec(2) = dpsidr/psia
else
fjac(1,1) = dpsidr/psia
fjac(1,2) = dpsidz/psia
fjac(2,1) = ddpsidrr/psia
fjac(2,2) = ddpsidrz/psia
end if
return
end
c
c
c
subroutine print_prof
implicit real*8 (a-h,o-z)
parameter(nnw=501,eps=1.d-4)
dimension psinr(nnw),qpsi(nnw)
c
common/psinr/psinr
common/qpsi/qpsi
common/eqnn/nr,nz,npp,nintp
common/dens/dens,ddens
c
write(55,*) ' #psi rhot ne Te q Jphi'
psin=0.0d0
rhop=0.0d0
rhot=0.0d0
call density(psin)
call tor_curr_psi(eps,ajphi)
te=temp(psin)
qq=qpsi(1)
c
write(55,111) psin,rhot,dens,te,qq,ajphi*1.d-6
c
nst=nr
do i=2,nst
psin=dble(i-1)/dble(nst-1)
rhop=sqrt(psin)
c
call density(psin)
te=temp(psin)
c
ips=int((nr-1)*psin+1)
if(i.lt.nst) then
call intlin(psinr(ips),qpsi(ips),psinr(ips+1),qpsi(ips+1),
. psin,qq)
else
qq=qpsi(nr)
end if
rhot=frhotor(psin)
call tor_curr_psi(psin,ajphi)
write(55,111) psin,rhot,dens,te,qq,ajphi*1.d-6
end do
c
return
111 format(12(1x,e12.5))
end
c
c
c
subroutine surfq(qval,psival)
implicit real*8 (a-h,o-z)
parameter(nnw=501)
parameter(ncnt=100,ncntt=2*ncnt+1)
dimension psinr(nnw),qpsi(nnw)
dimension rcon(ncntt),zcon(ncntt)
c
common/psinr/psinr
common/qpsi/qpsi
common/eqnn/nr,nz,npp,nintp
c
c locate psi surface for q=qval
c
call locate(qpsi,nr,qval,i1)
call intlin(qpsi(i1),psinr(i1),qpsi(i1+1),psinr(i1+1),
. qval,psival)
ipr=1
call contours_psi(psival,ncnt,rcon,zcon,ipr)
return
end
c
c
c
subroutine bfield_res
implicit real*8 (a-h,o-z)
parameter(nnw=501,nnh=501)
dimension rv(nnw),zv(nnh),psin(nnw,nnh)
dimension btotal(nnw,nnh)
parameter(icmx=2002)
dimension rrcb(icmx),zzcb(icmx),ncpts(10)
c
common/cpsin/rv,zv,psin
common/eqnn/nr,nz,npp,nintp
common/parbres/bres
common/btt/btotal
c
c Btotal on psi grid
c
btmx=-1.0d30
btmn=1.0d30
do j=1,nr
rrj=rv(j)
do k=1,nz
zzk=zv(k)
call bfield(rrj,zzk,bbphi,bbr,bbz)
btotal(j,k)=sqrt(bbr**2+bbz**2+bbphi**2)
if(btotal(j,k).ge.btmx) btmx=btotal(j,k)
if(btotal(j,k).le.btmn) btmn=btotal(j,k)
c write(90,113) j,rrj,zzk,btotal(j,k)
enddo
c write(90,*) ' '
enddo
c
c compute Btot=Bres and Btot=Bres/2
c
write(70,*)'#i Btot R z'
do n=1,5
bbb=bres/dble(n)
if (bbb.ge.btmn.and.bbb.le.btmx) then
call cniteq(bbb,nconts,ncpts,nctot,rrcb,zzcb,1)
do inc=1,nctot
write(70,113) inc,bbb,rrcb(inc),zzcb(inc)
end do
end if
write(70,*) ' '
end do
c
return
113 format(i6,12(1x,e12.5))
end
c
c
subroutine profdata
implicit real*8 (a-h,o-z)
parameter(npmx=250,npest=npmx+4)
dimension psrad(npmx),terad(npmx),derad(npmx),zfc(npmx)
dimension ct(npmx,4),cz(npmx,4)
parameter(lwrkf=npmx*4+npest*16)
dimension tfn(npest),cfn(npest),wrkf(lwrkf),iwrkf(npest),wf(npmx)
dimension densi(npest),ddensi(npest),d2densi(npest),wrkfd(npest)
c
common/densbnd/psdbnd
common/denspp/psnpp,aa,bb,cc
common/eqnn/nr,nz,npp,nintp
common/iipr/iprof
common/nfile/neqdsk,nprof
common/crad/psrad,derad,terad,zfc
common/coffte/ct
common/coffz/cz
common/factb/factb
common/coffdt/tfn
common/coffdnst/nsfd
common/cofffn/cfn
common/scal/iscal
common/facttn/factt,factn
c
c read plasma profiles from file if iprof>0
c
if (iscal.eq.0) then
aat=2.0d0/3.0d0
aan=4.0d0/3.0d0
else
aat=1.0d0
aan=1.0d0
end if
ffact=factb
if(iscal.eq.2) ffact=1.0d0
c
if (iprof.gt.0) then
read(nprof,*) npp
read(nprof,*) psrad0,terad0,derad0,zfc0
if(psrad0.ne.0.0d0) psrad0=0.0d0
psrad(1)=psrad0
terad(1)=terad0*ffact**aat*factt
derad(1)=derad0*ffact**aan*factn
zfc(1)=zfc0
wf(1)=1.0d0
do i=2,npp
read(nprof,*) psradi,teradi,deradi,zfci
psrad(i)=psradi
terad(i)=teradi*ffact**aat*factt
derad(i)=deradi*ffact**aan*factn
zfc(i)=zfci
wf(i)=1.0d0
end do
c
c spline approximation of temperature and Zeff
c
iopt=0
call difcsn(psrad,terad,npmx,npp,iopt,ct,ier)
c
iopt=0
call difcsn(psrad,zfc,npmx,npp,iopt,cz,ier)
c
c spline approximation of density
c
iopt=0
xb=0.0d0
xe=psrad(npp)
kspl=3
sspl=.001d0
c
call curfit(iopt,npp,psrad,derad,wf,xb,xe,kspl,sspl,npest,nsfd,
. tfn,cfn,fp,wrkf,lwrkf,iwrkf,ier)
c
call splev(tfn,nsfd,cfn,3,psrad,densi,npp,ier)
nu=1
call splder(tfn,nsfd,cfn,3,nu,psrad,ddensi,npp,wrkfd,ier)
dnpp=densi(npp)
ddnpp=ddensi(npp)
c
nu=2
call splder(tfn,nsfd,cfn,3,nu,psrad,d2densi,npp,wrkfd,ier)
d2dnpp=d2densi(npp)
if(derad(npp).eq.0.0d0) then
psdbnd=psrad(npp)
else
psnpp=psrad(npp)
dpsb=-psnpp+psdbnd
nn=3
nn1=nn+1
nn2=nn+2
aa=(nn1*nn2*dnpp+2*nn1*ddnpp*dpsb+d2dnpp*dpsb**2)
aa=aa/(-dpsb)**nn/2.0d0
bb=-(nn*nn2*dnpp+(2*nn+1)*ddnpp*dpsb+d2dnpp*dpsb**2)
bb=bb/(-dpsb)**nn1
cc=(nn1*nn*dnpp+2*nn*ddnpp*dpsb+d2dnpp*dpsb**2)
cc=cc/(-dpsb)**nn2/2.0d0
end if
c
end if
c
return
end
c
c
c
subroutine rhotor(nr)
implicit real*8(a-h,o-z)
parameter(nnw=501)
dimension psinr(nnw),qpsi(nnw),rhotnr(nnw),cq(nnw,4),crhot(nnw,4)
common/psinr/psinr
common/qpsi/qpsi
common/rhotsx/rhotsx
common/crhot/crhot
c
c normalized toroidal rho : ~ Integral q(psi) dpsi
c
iopt=0
call difcsn(psinr,qpsi,nnw,nr,iopt,cq,ier)
c
rhotnr(1)=0.0d0
do k=1,nr-1
dx=psinr(k+1)-psinr(k)
drhot=dx*(cq(k,1)+dx*(cq(k,2)/2.0d0+dx*(cq(k,3)/3.0d0
. +dx*cq(k,4)/4.0d0)))
rhotnr(k+1)=rhotnr(k)+drhot
end do
rhotsx=rhotnr(nr)
do k=1,nr
rhotnr(k)=sqrt(rhotnr(k)/rhotnr(nr))
end do
c
c spline interpolation of rhotor
c
iopt=0
call difcs(psinr,rhotnr,nr,iopt,crhot,ier)
return
end
function frhotor_eq(psi)
implicit real*8(a-h,o-z)
parameter(nnw=501)
dimension psinr(nnw),crhot(nnw,4)
common/psinr/psinr
common/eqnn/nr,nz,npp,nintp
common/crhot/crhot
c
irt=int((nr-1)*psi+1)
if(irt.eq.0) irt=1
if(irt.eq.nr) irt=nr-1
dps=psi-psinr(irt)
frhotor_eq=spli(crhot,nr,irt,dps)
return
end
function frhotor(psi)
implicit real*8(a-h,o-z)
frhotor=frhotor_eq(psi)
return
end
function frhotor_av(psi)
implicit real*8(a-h,o-z)
parameter(nnintp=101)
dimension rpstab(nnintp),crhotq(nnintp,4)
common/pstab/rpstab
common/eqnn/nr,nz,npp,nintp
common/crhotq/crhotq
rpsi=sqrt(psi)
ip=int((nintp-1)*rpsi+1)
if(ip.eq.0) ip=1
if(ip.eq.nintp) ip=nintp-1
dps=rpsi-rpstab(ip)
frhotor_av=spli(crhotq,nintp,ip,dps)
return
end
subroutine cniteq(h, ncon, npts, icount, rcon, zcon,ichoi)
implicit real*8 (a-h,o-z)
c
c v2.01 12/07/95 -- written by d v bartlett, jet joint undertaking.
c (based on an older code)
c
parameter(nnw=501,nnh=501,icmx=2002,nna=nnw*nnh)
dimension a(nna),ja(3,2),lx(1000),npts(10)
dimension rcon(icmx),zcon(icmx)
dimension rqgrid(nnw),zqgrid(nnh),psin(nnw,nnh),btotal(nnw,nnh)
c
common/pareq2/btaxis,rmaxis,zmaxis,rmnm,rmxm,zmnm,zmxm,dr,dz
common/cpsin/rqgrid,zqgrid,psin
common/btt/btotal
common/eqnn/nr,nz,npp,nintp
c
data px/0.5d0/
c
if(ichoi.eq.0) then
do j=1,nz
do i=1,nr
a(nr*(j-1)+i)=psin(i,j)
enddo
enddo
endif
c
if(ichoi.eq.1) then
do j=1,nz
do i=1,nr
a(nr*(j-1)+i)=btotal(i,j)
enddo
enddo
endif
c
do ico=1,icmx
rcon(ico)=0.0d0
zcon(ico)=0.0d0
enddo
c
nrqmax=nr
nreq=nr
nzeq=nz
drgrd=dr
dzgrd=dz
c
ncon = 0
do i=1,10
npts(i) = 0
end do
iclast = 0
icount = 0
mpl=0
ix=0
mxr = nrqmax * (nzeq - 1)
n1 = nreq - 1
c
do 3 jx=2,n1
do 3 jm=jx,mxr,nrqmax
j = jm + nrqmax
ah=a(j)-h
if(ah) 60,60,61
60 if(a(jm)-h) 62,62,1
61 if(a(jm)-h) 1,1,63
1 ix=ix+1
lx(ix)=-j
if(ah) 62,62,63
62 if(a(j-1)-h) 3,3,4
63 if(a(j-1)-h) 4,4,3
4 ix=ix+1
lx(ix)=j
3 continue
c
do 79 jm=nreq,mxr,nrqmax
j = jm + nrqmax
ah=a(j)-h
if(ah) 64,64,65
64 if(a(j-1)-h) 66,66,76
65 if(a(j-1)-h) 76,76,67
76 ix=ix+1
lx(ix)=j
if(ah) 66,66,67
66 if(a(jm)-h) 79,79,78
67 if(a(jm)-h) 78,78,79
78 ix=ix+1
lx(ix)=-j
79 continue
c
do 75 jm=1,mxr,nrqmax
j = jm + nrqmax
if(a(j)-h) 68,68,69
68 if(a(jm)-h)75,75,71
69 if(a(jm)-h)71,71,75
71 ix=ix+1
lx(ix) =-j
75 continue
c
do 73 j=2,nreq
if(a(j)-h) 58,58,59
58 if(a(j-1)-h) 73,73,72
59 if(a(j-1)-h) 72,72,73
72 ix=ix+1
lx(ix)=j
73 continue
c
if(ix) 50,50,8
108 if(mpl.lt.4) go to 8
ncon = ncon + 1
npts(ncon) = icount - iclast
iclast = icount
8 in=ix
jx=lx(in)
jfor=0
lda=1
ldb=2
30 if(jx) 21,22,22
21 jabs=-jx
jnb = jabs - nrqmax
go to 23
22 jabs=jx
jnb=jabs-1
23 adn=a(jabs)-a(jnb)
if(adn) 24,9,24
24 px=(a(jabs)-h)/adn
9 kx = (jabs - 1) / nrqmax
ikx = jabs - nrqmax * kx - 1
if(jx) 25,26,26
25 x = drgrd * ikx
y = dzgrd * (kx - px)
go to 27
26 x = drgrd * (ikx - px)
y = dzgrd * kx
27 continue
icount = icount + 1
rcon(icount) = x + rqgrid(1)
zcon(icount) = y + zqgrid(1)
mpl= icount
itm = 1
ja(1,1) = jabs + nrqmax
j=1
if(jx) 10,10,11
10 ja(1,1) = -jabs-1
j=2
11 ja(2,1)=-ja(1,1)
ja(3,1) = -jx + 1 - nrqmax
ja(3,2) = -jx
ja(j,2) = jabs - nrqmax
k= 3-j
ja(k,2) = 1-jabs
if (kx) 14,14,39
39 if(ikx) 14,14,36
36 if(ikx + 1 - nreq) 35, 37, 37
37 if(jx) 38,38,35
35 if(jfor) 28,29,28
28 do 13 i=1,3
if(jfor-ja(i,2)) 13,14,13
13 continue
38 lda=2
go to 15
14 lda=1
15 ldb=lda
29 do 18 k=1,3
do 18 l=lda,ldb
do 16 i=1,ix
if(lx(i)-ja(k,l)) 16,17,16
16 continue
go to 18
17 itm=itm+1
inext= i
if(jfor) 19,33,19
33 if(itm .gt. 3) goto 20
18 continue
19 lx(in)=0
if(itm .eq. 1) goto 6
20 jfor=jx
jx=lx(inext)
in = inext
go to 30
6 if(lx(ix)) 108,7,108
7 ix= ix-1
if(ix) 51,51,6
51 if(mpl.lt.4) go to 50
ncon = ncon + 1
npts(ncon) = icount - iclast
iclast = icount
50 continue
c
return
end
c
c
c
subroutine contours_psi(h,np,rcn,zcn,ipr)
implicit real*8 (a-h,o-z)
parameter(pi=3.14159265358979d0)
parameter(mest=4,kspl=3)
parameter(nnw=501,nnh=501)
parameter(nrest=nnw+4,nzest=nnh+4)
dimension rcn(2*np+1),zcn(2*np+1)
dimension cc(nnw*nnh),tr(nrest),tz(nzest)
dimension czc(nrest),zeroc(mest)
c
common/pareq1/psia
common/pareq1t/psiant,psinop
common/coffeqn/nsr,nsz,nsft
common/coffeq/cc
common/coffeqt/tr,tz
common/cnt/rup,zup,rlw,zlw
common/rwallm/rwallm
c
ra=rup
rb=rlw
za=zup
zb=zlw
call points_tgo(ra,za,rup,zup,h,info)
call points_tgo(rb,zb,rlw,zlw,h,info)
th=pi/dble(np)
rcn(1)=rlw
zcn(1)=zlw
rcn(2*np+1)=rlw
zcn(2*np+1)=zlw
rcn(np+1)=rup
zcn(np+1)=zup
do ic=2,np
zc=zlw+(zup-zlw)*(1.0d0-cos(th*(ic-1)))/2.0d0
iopt=1
call profil(iopt,tr,nsr,tz,nsz,cc,kspl,kspl,zc,nsr,czc,ier)
if(ier.gt.0) print*,' profil =',ier
val=h*psiant+psinop
call sproota(val,tr,nsr,czc,zeroc,mest,m,ier)
if (zeroc(1).gt.rwallm) then
rcn(ic)=zeroc(1)
zcn(ic)=zc
rcn(2*np+2-ic)=zeroc(2)
zcn(2*np+2-ic)=zc
else
rcn(ic)=zeroc(2)
zcn(ic)=zc
rcn(2*np+2-ic)=zeroc(3)
zcn(2*np+2-ic)=zc
end if
end do
if (ipr.gt.0) then
do ii=1,2*np+1
write(71,111) ii,h,rcn(ii),zcn(ii)
end do
write(71,*)
write(71,*)
end if
return
111 format(i6,12(1x,e12.5))
99 format(12(1x,e12.5))
end
c
c
c
subroutine flux_average
implicit real*8 (a-h,o-z)
real*8 lam
parameter(nnintp=101,ncnt=100,ncntt=2*ncnt+1,nlam=41)
parameter(zero=0.0d0,one=1.0d0)
parameter(pi=3.14159265358979d0,ccj=1.0d+7/(4.0d0*pi))
parameter(ksp=3,njest=nnintp+ksp+1,nlest=nlam+ksp+1)
parameter(lwrk=4*(nnintp+nlam)+11*(njest+nlest)+
. njest*nnintp+nlest+54)
parameter(kwrk=nnintp+nlam+njest+nlest+3)
parameter(lw01=nnintp*4+nlam*3+nnintp*nlam)
dimension pstab(nnintp),varea(nnintp),vvol(nnintp),rpstab(nnintp)
dimension rri(nnintp),rbav(nnintp),bav(nnintp),rhotqv(nnintp)
dimension bmxpsi(nnintp),bmnpsi(nnintp),ffc(nnintp)
dimension vcurrp(nnintp),vajphiav(nnintp),qqv(nnintp)
dimension rcon(2*ncnt+1),zcon(2*ncnt+1)
dimension dlpv(2*ncnt),bv(2*ncnt+1),bpv(2*ncnt+1)
dimension cbmx(nnintp,4),cbmn(nnintp,4),crbav(nnintp,4)
dimension cvol(nnintp,4),crri(nnintp,4),carea(nnintp,4)
dimension cratjpl(nnintp,4),cratja(nnintp,4),cratjb(nnintp,4)
dimension cfc(nnintp,4),crhotq(nnintp,4)
dimension vratjpl(nnintp),vratja(nnintp),vratjb(nnintp)
dimension alam(nlam),fhlam(nnintp,nlam)
dimension ffhlam(nnintp*nlam),dffhlam(nnintp*nlam)
dimension tjp(njest),tlm(nlest),ch((njest-4)*(nlest-4))
dimension iwrk(kwrk),wrk(lwrk)
dimension ch01(lw01),weights(nlam)
c
common/cent/btrcen,rcen
common/pareq2/btaxis,rmaxis,zmaxis,rmnm,rmxm,zmnm,zmxm,dr,dz
common/eqnn/nr,nz,npp,nintp
common/derip/dpsidr,dpsidz,ddpsidrr,ddpsidzz,ddpsidrz,fpolv,ffpv
c
common/pstab/rpstab
common/flav/vvol,rri,rbav,bmxpsi,bmnpsi
common/cflav/cvol,crri,crbav,cbmx,cbmn,carea,cfc
common/cratj/cratja,cratjb,cratjpl
common/crhotq/crhotq
common/cnt/rup,zup,rlw,zlw
common/bound/zbmin,zbmax
common/rarea/rarea
c
common/coffvl/ch
common/coffdvl/ch01
common/coffvlt/tjp,tlm
common/coffvln/njpt,nlmt
c computation of flux surface averaged quantities
write(71,*)' #i psin R z'
nintp=nnintp
ninpr=(nintp-1)/10
dlam=1.0d0/dble(nlam-1)
do l=1,nlam-1
alam(l)=dble(l-1)*dlam
fhlam(1,l)=sqrt(1.0d0-alam(l))
ffhlam(l)=fhlam(1,l)
dffhlam(l)=-0.5d0/sqrt(1.0d0-alam(l))
weights(l)=1.0d0
end do
weights(1)=0.5d0
weights(nlam)=0.5d0
alam(nlam)=1.0d0
fhlam(1,nlam)=0.0d0
ffhlam(nlam)=0.0d0
dffhlam(nlam)=-99999.0d0
jp=1
anorm=2.0d0*pi*rmaxis/abs(btaxis)
b2av=btaxis**2
dvdpsi=2.0d0*pi*anorm
dadpsi=2.0d0*pi/abs(btaxis)
ratio_cdator=abs(btaxis/btrcen)
ratio_cdbtor=1.0d0
ratio_pltor=1.0d0
qq=1.0d0
fc=1.0d0
pstab(1)=0.0d0
rpstab(1)=0.0d0
rhotqv(1)=0.0d0
vcurrp(1)=0.0d0
vajphiav(1)=0.0d0
bmxpsi(1)=abs(btaxis)
bmnpsi(1)=abs(btaxis)
bav(1)=abs(btaxis)
rbav(1)=1.0d0
rri(1)=rmaxis
varea(1)=0.0d0
vvol(1)=0.0d0
vratjpl(1)=ratio_pltor
vratja(1)=ratio_cdator
vratjb(1)=ratio_cdbtor
ffc(1)=fc
rhot2q=0.0d0
C rup=rmaxis
C rlw=rmaxis
C zup=(zbmax+zmaxis)/2.0d0
C zlw=(zmaxis+zbmin)/2.0d0
do jp=2,nintp
height=dble(jp-1)/dble(nintp-1)
if(jp.eq.nintp) height=0.9999d0
ipr=0
jpr=mod(jp,ninpr)
if(jpr.eq.1) ipr=1
height2=height*height
call contours_psi(height2,ncnt,rcon,zcon,ipr)
c
r2iav=0.0d0
anorm=0.0d0
dadpsi=0.0d0
currp=0.0d0
b2av=0.0d0
area=0.0d0
volume=0.0d0
ajphiav=0.0d0
bbav=0.0d0
bmmx=-1.0d+30
bmmn=1.0d+30
call bfield(rcon(1),zcon(1),bphi,brr,bzz)
call tor_curr(rcon(1),zcon(1),ajphi0)
btot0=sqrt(bphi**2+brr**2+bzz**2)
bpoloid0=sqrt(brr**2+bzz**2)
bv(1)=btot0
bpv(1)=bpoloid0
rpsim0=rcon(1)
do inc=1,ncntt-1
inc1=inc+1
dla=sqrt((rcon(inc)-rmaxis)**2+(zcon(inc)-zmaxis)**2)
dlb=sqrt((rcon(inc1)-rmaxis)**2+(zcon(inc1)-zmaxis)**2)
dlp=sqrt((rcon(inc1)-rcon(inc))**2+
. (zcon(inc1)-zcon(inc))**2)
drc=(rcon(inc1)-rcon(inc))
c compute length, area and volume defined by psi=height^2
ph=0.5d0*(dla+dlb+dlp)
area2=ph*(ph-dla)*(ph-dlb)*(ph-dlp)
area=area+sqrt(area2)
rzp=rcon(inc1)*zcon(inc1)
rz=rcon(inc)*zcon(inc)
volume=pi*(rzp+rz)*drc+volume
c compute line integral on the contour psi=height^2
rpsim=rcon(inc1)
zpsim=zcon(inc1)
call bfield(rpsim,zpsim,bphi,brr,bzz)
call tor_curr(rpsim,zpsim,ajphi)
btot=sqrt(bphi**2+brr**2+bzz**2)
bpoloid=sqrt(brr**2+bzz**2)
dlpv(inc)=dlp
bv(inc1)=btot
bpv(inc1)=bpoloid
dlph=0.5d0*dlp
anorm=anorm+dlph*(1.0d0/bpoloid+1.0d0/bpoloid0)
dadpsi=dadpsi+dlph*
. (1.0d0/(bpoloid*rpsim)+1.0d0/(bpoloid0*rpsim0))
currp=currp+dlph*(bpoloid+bpoloid0)
b2av=b2av+dlph*(btot0**2/bpoloid0+btot**2/bpoloid)
bbav=bbav+dlph*(btot/bpoloid+btot0/bpoloid0)
r2iav=r2iav+dlph*
. (1.0d0/(bpoloid*rpsim**2)+1.0d0/(bpoloid0*rpsim0**2))
ajphiav=ajphiav+dlph*
. (ajphi0/(bpoloid0*rpsim0)+ajphi/(bpoloid*rpsim))
ajphi0=ajphi
rpsim0=rpsim
bpoloid0=bpoloid
btot0=btot
c computation maximum/minimum B values on given flux surface
if(btot.le.bmmn) bmmn=btot
if(btot.ge.bmmx) bmmx=btot
end do
c bav=<B> [T] , b2av=<B^2> [T^2] , rbav=<B>/b_min
c anorm = int d l_p/B_p = dV/dpsi/(2pi)
c r2iav=<1/R^2> [m^-2] ,
c riav=<1/R> [m^-1] = dA/dpsi/(dV/dpsi/(2pi)),
c rri = <B>/(|R B_tor|<1/R^2>) , used to compute I_tor [m^-1]
c currp = plasma current within psi=const
bbav=bbav/anorm
r2iav=r2iav/anorm
dvdpsi=2.0d0*pi*anorm
riav=dadpsi/anorm
b2av=b2av/anorm
vcurrp(jp)=ccj*currp
vajphiav(jp)=ajphiav/dadpsi
c area == varea, volume == vvol
c flux surface minor radius == (area/pi)^1/2
c ratio_cdator = Jcd_astra/J_phi Jcd_astra = <Jcd.B>/B0
c ratio_cdbtor = Jcd_jintrac/J_phi Jcd_jintrac = <Jcd.B>/<B>
c ratio_pltor = Jcd_||/J_phi Jcd_|| = <Jcd.b>
pstab(jp)=height2
rpstab(jp)=height
vvol(jp)=abs(volume)
varea(jp)=area
bav(jp)=bbav
rbav(jp)=bbav/bmmn
bmxpsi(jp)=bmmx
bmnpsi(jp)=bmmn
rri(jp)=bav(jp)/abs(fpolv*r2iav)
ratio_cdator=abs(b2av*riav/(fpolv*r2iav*btrcen))
ratio_cdbtor=abs(b2av*riav/(fpolv*r2iav*bbav))
ratio_pltor=abs(bbav*riav/(fpolv*r2iav))
vratjpl(jp)=ratio_pltor
vratja(jp)=ratio_cdator
vratjb(jp)=ratio_cdbtor
qq=abs(dvdpsi*fpolv*r2iav/(4*pi*pi))
qqv(jp)=qq
c
c write(57,99) sqrt(pstab(jp)),pstab(jp),riav,dvdpsi,area,vvol(jp)
c computation of rhot from calculated q profile
rhot2q=rhot2q+(qqv(jp)*rpstab(jp)+qqv(jp-1)*rpstab(jp-1))
. /dble(nintp-1)
rhotqv(jp)=sqrt(rhot2q)
c computation of fraction of circulating/trapped fraction fc, ft
c and of function H(lambda,rhop)
c ffhlam = Bmn/Bmx/fc integral_lambda^1 dlam/<sqrt(1-lam*B(rhop)/Bmx)>
fc=0.0d0
shlam=0.0d0
do l=nlam,1,-1
lam=alam(l)
srl=0.0d0
rl2=1.0d0-lam*bv(1)/bmmx
rl0=0.d0
if(rl2.gt.0) rl0=sqrt(rl2)
do inc=1,ncntt-1
rl2=1.0d0-lam*bv(inc+1)/bmmx
rl=0.0d0
if(rl2.gt.0) rl=sqrt(rl2)
srl=srl+0.5d0*dlpv(inc)*(rl/bpv(inc+1)+rl0/bpv(inc))
rl0=rl
end do
srl=srl/anorm
dhlam=0.5d0/srl
fc=fc+lam/srl*weights(l)
if(l.eq.nlam) then
fhlam(jp,l)=0.0d0
ffhlam(nlam*(jp-1)+l)=0.0d0
dffhlam(nlam*(jp-1)+l)=-dhlam
dhlam0=dhlam
else
shlam=shlam+0.5d0*(dhlam+dhlam0)*dlam
fhlam(jp,l)=shlam
dffhlam(nlam*(jp-1)+l)=-dhlam
dhlam0=dhlam
end if
end do
fc=0.75d0*b2av/bmmx**2*fc*dlam
ffc(jp)=fc
ccfh=bmmn/bmmx/fc
do l=1,nlam
ffhlam(nlam*(jp-1)+l)=ccfh*fhlam(jp,l)
dffhlam(nlam*(jp-1)+l)=ccfh*dffhlam(nlam*(jp-1)+l)
end do
end do
write(56,*)' #psi rhot_eq rhot_av |<B>| |Bmx| |Bmn|'//
.' Area Vol |I_pl| <J_phi> qq fc ratio_cdbtor'
qqv(1)=qqv(2)
vajphiav(1)=vajphiav(2)
do jp=1,nintp
rhotqv(jp)=rhotqv(jp)/rhotqv(nintp)
if(jp.eq.nintp) then
rhotqv(jp)=1.0d0
rpstab(jp)=1.0d0
pstab(jp)=1.0d0
end if
rhot_eq=frhotor_eq(pstab(jp))
write(56,99) pstab(jp),rhot_eq,rhotqv(jp),
. bav(jp),bmxpsi(jp),bmnpsi(jp),varea(jp),vvol(jp),
. vcurrp(jp),vajphiav(jp),qqv(jp),ffc(jp)
end do
rarea=sqrt(varea(nintp)/pi)
c spline coefficients of vvol,rbav,rri,bmxpsi,bmnpsi
c used for computations of dP/dV and J_cd
c spline coefficients of rhot
iopt=0
call difcs(rpstab,vvol,nintp,iopt,cvol,ier)
iopt=0
call difcs(rpstab,rbav,nintp,iopt,crbav,ier)
iopt=0
call difcs(rpstab,rri,nintp,iopt,crri,ier)
iopt=0
call difcs(rpstab,bmxpsi,nintp,iopt,cbmx,ier)
iopt=0
call difcs(rpstab,bmnpsi,nintp,iopt,cbmn,ier)
iopt=0
call difcs(rpstab,vratja,nintp,iopt,cratja,ier)
iopt=0
call difcs(rpstab,vratjb,nintp,iopt,cratjb,ier)
iopt=0
call difcs(rpstab,vratjpl,nintp,iopt,cratjpl,ier)
iopt=0
call difcs(rpstab,varea,nintp,iopt,carea,ier)
iopt=0
call difcs(rpstab,ffc,nintp,iopt,cfc,ier)
iopt=0
call difcs(rpstab,rhotqv,nintp,iopt,crhotq,ier)
c spline interpolation of H(lambda,rhop) and dH/dlambda
iopt=0
s=0.0d0
call regrid(iopt,nintp,rpstab,nlam,alam,ffhlam,
. zero,one,zero,one,ksp,ksp,s,
. njest,nlest,njp,tjp,nlm,tlm,ch,fp,wrk,lwrk,iwrk,kwrk,ier)
njpt=njp
nlmt=nlm
call coeff_parder(tjp,njp,tlm,nlm,ch,ksp,ksp,0,1,
. ch01,lw01,ier)
return
99 format(20(1x,e12.5))
end
c
c
c
subroutine vectinit
implicit real*8 (a-h,o-z)
parameter(jmx=31,kmx=36,nmx=8000)
dimension psjki(jmx,kmx,nmx)
dimension tauv(jmx,kmx,nmx),alphav(jmx,kmx,nmx)
dimension pdjki(jmx,kmx,nmx),ppabs(jmx,kmx,nmx)
dimension currj(jmx,kmx,nmx),didst(jmx,kmx,nmx),ccci(jmx,kmx,nmx)
dimension iiv(jmx,kmx),iop(jmx,kmx),iow(jmx,kmx),tau1v(jmx,kmx)
parameter(tmax=5,npts=500)
real*8 ttv(npts+1),extv(npts+1)
common/ttex/ttv,extv
c
common/warm/iwarm,ilarm
common/iiv/iiv
common/iov/iop,iow
common/psjki/psjki
common/atjki/tauv,alphav
common/dpjjki/pdjki,currj
common/pcjki/ppabs,ccci
common/dcjki/didst
common/nray/nrayr,nrayth
common/nstep/nstep
common/tau1v/tau1v
c
if(nstep.gt.nmx) nstep=nmx
if(nrayr.gt.jmx) nrayr=jmx
if(nrayth.gt.kmx) nrayth=kmx
c
do i=1,nstep
do k=1,nrayth
do j=1,nrayr
psjki(j,k,i)=0.0d0
tauv(j,k,i)=0.0d0
alphav(j,k,i)=0.0d0
pdjki(j,k,i)=0.0d0
ppabs(j,k,i)=0.0d0
didst(j,k,i)=0.0d0
ccci(j,k,i)=0.0d0
currj(j,k,i)=0.0d0
iiv(j,k)=1
iop(j,k)=0
iow(j,k)=0
tau1v(j,k)=0.0d0
end do
end do
end do
c
if(iwarm.gt.1) then
dt=2.0d0*tmax/dble(npts)
do i = 1, npts+1
ttv(i) = -tmax+dble(i-1)*dt
extv(i)=exp(-ttv(i)*ttv(i))
end do
end if
c
return
end
subroutine vectinit2
implicit real*8 (a-h,o-z)
parameter(jmx=31,kmx=36,nmx=8000)
dimension psjki(jmx,kmx,nmx)
dimension tauv(jmx,kmx,nmx),alphav(jmx,kmx,nmx)
dimension pdjki(jmx,kmx,nmx),ppabs(jmx,kmx,nmx)
dimension currj(jmx,kmx,nmx),didst(jmx,kmx,nmx),ccci(jmx,kmx,nmx)
dimension iiv(jmx,kmx),iop(jmx,kmx),iow(jmx,kmx)
common/iiv/iiv
common/iov/iop,iow
common/psjki/psjki
common/atjki/tauv,alphav
common/dpjjki/pdjki,currj
common/pcjki/ppabs,ccci
common/dcjki/didst
common/nray/nrayr,nrayth
common/nstep/nstep
do i=1,nstep
do k=1,nrayth
do j=1,nrayr
psjki(j,k,i)=0.0d0
tauv(j,k,i)=0.0d0
alphav(j,k,i)=0.0d0
pdjki(j,k,i)=0.0d0
ppabs(j,k,i)=0.0d0
didst(j,k,i)=0.0d0
ccci(j,k,i)=0.0d0
currj(j,k,i)=0.0d0
iiv(j,k)=1
iop(j,k)=0
iow(j,k)=0
end do
end do
end do
return
end
c
c
c
subroutine paraminit
implicit real*8(a-h,o-z)
c
common/istep/istep
common/istgr/istpr,istpl
common/ierr/ierr
common/istop/istop
common/ipol/ipolc
c
istpr=0
istpl=1
ierr=0
istep=0
istop=0
ipolc=0
c
return
end
c
c
subroutine updatepos
implicit real*8 (a-h,o-z)
parameter(jmx=31,kmx=36)
dimension xc(3,jmx,kmx),xco(3,jmx,kmx)
dimension du1(3,jmx,kmx),du1o(3,jmx,kmx)
dimension ywrk(6,jmx,kmx),ypwrk(6,jmx,kmx)
c
common/nray/nrayr,nrayth
common/grco/xco,du1o
common/grc/xc,du1
common/wrk/ywrk,ypwrk
c
do j=1,nrayr
do k=1,nrayth
if(j.eq.1.and.k.gt.1) then
xco(1,j,k)=xco(1,j,1)
xco(2,j,k)=xco(2,j,1)
xco(3,j,k)=xco(3,j,1)
xc(1,j,k)=xc(1,j,1)
xc(2,j,k)=xc(2,j,1)
xc(3,j,k)=xc(3,j,1)
else
xco(1,j,k)=xc(1,j,k)
xco(2,j,k)=xc(2,j,k)
xco(3,j,k)=xc(3,j,k)
xc(1,j,k)=ywrk(1,j,k)
xc(2,j,k)=ywrk(2,j,k)
xc(3,j,k)=ywrk(3,j,k)
end if
du1o(1,j,k)=du1(1,j,k)
du1o(2,j,k)=du1(2,j,k)
du1o(3,j,k)=du1(3,j,k)
end do
end do
c
return
end
c
c
c
subroutine gradi
implicit real*8 (a-h,o-z)
parameter(jmx=31,kmx=36)
dimension dffiu(jmx),ddffiu(jmx)
dimension xc(3,jmx,kmx),xco(3,jmx,kmx)
dimension du1(3,jmx,kmx),du1o(3,jmx,kmx)
dimension gri(3,jmx,kmx),ggri(3,3,jmx,kmx)
dimension dgrad2v(3,jmx,kmx)
dimension grad2(jmx,kmx)
dimension dxv1(3),dxv2(3),dxv3(3),dgu(3)
dimension dgg1(3),dgg2(3),dgg3(3)
dimension df1(3),df2(3),df3(3)
c
common/nray/nrayr,nrayth
common/fi/dffiu,ddffiu
common/grco/xco,du1o
common/grc/xc,du1
common/grad2jk/grad2
common/dgrad2jk/dgrad2v
common/gradjk/gri
common/ggradjk/ggri
c
c compute grad u and grad(S_I)
c
do k=1,nrayth
do j=1,nrayr
if(j.eq.1) then
gri(1,j,k)=0.0d0
gri(2,j,k)=0.0d0
gri(3,j,k)=0.0d0
jp=j+1
km=k-1
if(k.eq.1) km=nrayth
kp=k+1
if(k.eq.nrayth) kp=1
do iv=1,3
dxv1(iv)=xc(iv,jp,k)-xc(iv,j,k)
dxv2(iv)=xc(iv,jp,kp)-xc(iv,jp,km)
dxv3(iv)=xc(iv,j,k)-xco(iv,j,k)
end do
call solg0(dxv1,dxv2,dxv3,dgu)
else
jm=j-1
km=k-1
if(k.eq.1) km=nrayth
kp=k+1
if(k.eq.nrayth) kp=1
do iv=1,3
dxv1(iv)=xc(iv,j,k)-xc(iv,jm,k)
dxv2(iv)=xc(iv,j,kp)-xc(iv,j,km)
dxv3(iv)=xc(iv,j,k)-xco(iv,j,k)
end do
call solg0(dxv1,dxv2,dxv3,dgu)
end if
du1(1,j,k)=dgu(1)
du1(2,j,k)=dgu(2)
du1(3,j,k)=dgu(3)
gri(1,j,k)=dgu(1)*dffiu(j)
gri(2,j,k)=dgu(2)*dffiu(j)
gri(3,j,k)=dgu(3)*dffiu(j)
grad2(j,k)=gri(1,j,k)**2+gri(2,j,k)**2+gri(3,j,k)**2
end do
end do
c
c compute derivatives of grad u and grad(S_I)
c
do k=1,nrayth
do j=1,nrayr
if(j.eq.1) then
jp=j+1
km=k-1
if(k.eq.1) km=nrayth
kp=k+1
if(k.eq.nrayth) kp=1
do iv=1,3
dxv1(iv)=xc(iv,jp,kp)-xc(iv,jp,km)
dxv2(iv)=xc(iv,jp,k)-xc(iv,j,k)
dxv3(iv)=xc(iv,j,k)-xco(iv,j,k)
end do
df1(1)=du1(1,jp,kp)-du1(1,jp,km)
df1(2)=du1(1,jp,k)-du1(1,j,k)
df1(3)=du1(1,j,k)-du1o(1,j,k)
df2(1)=du1(2,jp,kp)-du1(2,jp,km)
df2(2)=du1(2,jp,k)-du1(2,j,k)
df2(3)=du1(2,j,k)-du1o(2,j,k)
df3(1)=du1(3,jp,kp)-du1(3,jp,km)
df3(2)=du1(3,jp,k)-du1(3,j,k)
df3(3)=du1(3,j,k)-du1o(3,j,k)
call solg3(dxv1,dxv2,dxv3,df1,df2,df3,dgg1,dgg2,dgg3)
else
jm=j-1
km=k-1
if(k.eq.1) km=nrayth
kp=k+1
if(k.eq.nrayth) kp=1
do iv=1,3
dxv1(iv)=xc(iv,j,k)-xc(iv,jm,k)
dxv2(iv)=xc(iv,j,kp)-xc(iv,j,km)
dxv3(iv)=xc(iv,j,k)-xco(iv,j,k)
end do
df1(1)=du1(1,j,k)-du1(1,jm,k)
df1(2)=du1(1,j,kp)-du1(1,j,km)
df1(3)=du1(1,j,k)-du1o(1,j,k)
df2(1)=du1(2,j,k)-du1(2,jm,k)
df2(2)=du1(2,j,kp)-du1(2,j,km)
df2(3)=du1(2,j,k)-du1o(2,j,k)
df3(1)=du1(3,j,k)-du1(3,jm,k)
df3(2)=du1(3,j,kp)-du1(3,j,km)
df3(3)=du1(3,j,k)-du1o(3,j,k)
call solg3(dxv1,dxv2,dxv3,df1,df2,df3,dgg1,dgg2,dgg3)
end if
c
c derivatives of u
c
ux=du1(1,j,k)
uy=du1(2,j,k)
uz=du1(3,j,k)
uxx=dgg1(1)
uyy=dgg2(2)
uzz=dgg3(3)
uxy=(dgg1(2)+dgg2(1))/2.0d0
uxz=(dgg1(3)+dgg3(1))/2.0d0
uyz=(dgg2(3)+dgg3(2))/2.0d0
c
c derivatives of S_I and Grad(S_I)
c
dfu=dffiu(j)
dfuu=ddffiu(j)
gx=ux*dfu
gy=uy*dfu
gz=uz*dfu
gxx=dfuu*ux*ux+dfu*uxx
gyy=dfuu*uy*uy+dfu*uyy
gzz=dfuu*uz*uz+dfu*uzz
gxy=dfuu*ux*uy+dfu*uxy
gxz=dfuu*ux*uz+dfu*uxz
gyz=dfuu*uy*uz+dfu*uyz
c
ggri(1,1,j,k)=gxx
ggri(2,2,j,k)=gyy
ggri(3,3,j,k)=gzz
ggri(1,2,j,k)=gxy
ggri(2,1,j,k)=gxy
ggri(1,3,j,k)=gxz
ggri(3,1,j,k)=gxz
ggri(2,3,j,k)=gyz
ggri(3,2,j,k)=gyz
c
c derivatives of |Grad(S_I)|^2
c
dgrad2v(1,j,k)=2.0d0*(gx*gxx+gy*gxy+gz*gxz)
dgrad2v(2,j,k)=2.0d0*(gx*gxy+gy*gyy+gz*gyz)
dgrad2v(3,j,k)=2.0d0*(gx*gxz+gy*gyz+gz*gzz)
end do
end do
c
return
end
c
c solution of the linear system of 3 eqs : dgg . dxv = dff
c input vectors : dxv1, dxv2, dxv3, dff
c output vector : dgg
c
c dff=(1,0,0)
c
subroutine solg0(dxv1,dxv2,dxv3,dgg)
double precision denom,aa1,aa2,aa3
double precision dxv1(3),dxv2(3),dxv3(3),dgg(3)
aa1=(dxv2(2)*dxv3(3)-dxv3(2)*dxv2(3))
aa2=(dxv1(2)*dxv3(3)-dxv1(3)*dxv3(2))
aa3=(dxv1(2)*dxv2(3)-dxv1(3)*dxv2(2))
denom = dxv1(1)*aa1-dxv2(1)*aa2+dxv3(1)*aa3
dgg(1) = aa1/denom
dgg(2) = -(dxv2(1)*dxv3(3)-dxv3(1)*dxv2(3))/denom
dgg(3) = (dxv2(1)*dxv3(2)-dxv3(1)*dxv2(2))/denom
return
end
c
c three rhs vectors df1, df2, df3
c
subroutine solg3(dxv1,dxv2,dxv3,df1,df2,df3,dg1,dg2,dg3)
double precision denom,a11,a21,a31,a12,a22,a32,a13,a23,a33
double precision dxv1(3),dxv2(3),dxv3(3)
double precision df1(3),df2(3),df3(3)
double precision dg1(3),dg2(3),dg3(3)
a11=(dxv2(2)*dxv3(3)-dxv3(2)*dxv2(3))
a21=(dxv1(2)*dxv3(3)-dxv1(3)*dxv3(2))
a31=(dxv1(2)*dxv2(3)-dxv1(3)*dxv2(2))
a12=(dxv2(1)*dxv3(3)-dxv3(1)*dxv2(3))
a22=(dxv1(1)*dxv3(3)-dxv1(3)*dxv3(1))
a32=(dxv1(1)*dxv2(3)-dxv1(3)*dxv2(1))
a13=(dxv2(1)*dxv3(2)-dxv3(1)*dxv2(2))
a23=(dxv1(1)*dxv3(2)-dxv1(2)*dxv3(1))
a33=(dxv1(1)*dxv2(2)-dxv1(2)*dxv2(1))
denom = dxv1(1)*a11-dxv2(1)*a21+dxv3(1)*a31
dg1(1) = (df1(1)*a11-df1(2)*a21+df1(3)*a31)/denom
dg1(2) = -(df1(1)*a12-df1(2)*a22+df1(3)*a32)/denom
dg1(3) = (df1(1)*a13-df1(2)*a23+df1(3)*a33)/denom
dg2(1) = (df2(1)*a11-df2(2)*a21+df2(3)*a31)/denom
dg2(2) = -(df2(1)*a12-df2(2)*a22+df2(3)*a32)/denom
dg2(3) = (df2(1)*a13-df2(2)*a23+df2(3)*a33)/denom
dg3(1) = (df3(1)*a11-df3(2)*a21+df3(3)*a31)/denom
dg3(2) = -(df3(1)*a12-df3(2)*a22+df3(3)*a32)/denom
dg3(3) = (df3(1)*a13-df3(2)*a23+df3(3)*a33)/denom
return
end
c
c Runge-Kutta integrator
c
subroutine rkint4
implicit real*8 (a-h,o-z)
parameter(ndim=6,jmx=31,kmx=36)
dimension y(ndim),yy(ndim)
dimension fk1(ndim),fk2(ndim),fk3(ndim),fk4(ndim)
dimension dgr2(3),dgr(3),ddgr(3,3)
dimension ywrk(ndim,jmx,kmx),ypwrk(ndim,jmx,kmx)
dimension grad2(jmx,kmx),dgrad2v(3,jmx,kmx)
dimension gri(3,jmx,kmx),ggri(3,3,jmx,kmx)
c
common/nray/nrayr,nrayth
common/dsds/dst
c
common/wrk/ywrk,ypwrk
common/grad2jk/grad2
common/dgrad2jk/dgrad2v
common/gradjk/gri
common/ggradjk/ggri
common/gr/gr2
common/dgr/dgr2,dgr,ddgr
common/igrad/igrad
c
h=dst
hh=h*0.5d0
h6=h/6.0d0
c
do j=1,nrayr
kkk=nrayth
if(j.eq.1) kkk=1
do k=1,kkk
do ieq=1,ndim
y(ieq)=ywrk(ieq,j,k)
fk1(ieq)=ypwrk(ieq,j,k)
yy(ieq)=y(ieq)+fk1(ieq)*hh
end do
gr2=grad2(j,k)
do iv=1,3
dgr2(iv)=dgrad2v(iv,j,k)
dgr(iv)=gri(iv,j,k)
do jv=1,3
ddgr(iv,jv)=ggri(iv,jv,j,k)
end do
end do
call fwork(yy,fk2)
c
do ieq=1,ndim
yy(ieq)=y(ieq)+fk2(ieq)*hh
end do
call fwork(yy,fk3)
c
do ieq=1,ndim
yy(ieq)=y(ieq)+fk3(ieq)*h
end do
call fwork(yy,fk4)
c
do ieq=1,ndim
ywrk(ieq,j,k)=y(ieq)
. +h6*(fk1(ieq)+2.0d0*fk2(ieq)+2.0d0*fk3(ieq)+fk4(ieq))
end do
end do
end do
c
call updatepos
c
if(igrad.eq.1) call gradi
c
return
end
c
c
c
subroutine gwork(j,k)
implicit real*8 (a-h,o-z)
parameter(ndim=6,jmx=31,kmx=36)
dimension yy(ndim),yyp(ndim)
dimension dgr2(3),dgr(3),ddgr(3,3)
dimension ywrk(ndim,jmx,kmx),ypwrk(ndim,jmx,kmx)
dimension grad2(jmx,kmx),dgrad2v(3,jmx,kmx)
dimension gri(3,jmx,kmx),ggri(3,3,jmx,kmx)
c
common/igrad/igrad
c
common/wrk/ywrk,ypwrk
common/grad2jk/grad2
common/dgrad2jk/dgrad2v
common/gradjk/gri
common/ggradjk/ggri
common/gr/gr2
common/dgr/dgr2,dgr,ddgr
c
c begin --- update vector yy
c
do ieq=1,ndim
yy(ieq)=ywrk(ieq,j,k)
end do
c
if(igrad.eq.1) then
gr2=grad2(j,k)
do iv=1,3
dgr2(iv)=dgrad2v(iv,j,k)
dgr(iv)=gri(iv,j,k)
do jv=1,3
ddgr(iv,jv)=ggri(iv,jv,j,k)
end do
end do
end if
c
call fwork(yy,yyp)
c
do ieq=1,ndim
ypwrk(ieq,j,k)=yyp(ieq)
end do
c
c end --- update vector yy
c
return
end
c
c
c
subroutine fwork(y,dery)
implicit real*8 (a-h,o-z)
parameter(ndim=6)
dimension y(ndim),dery(ndim)
dimension xv(3),anv(3),vgv(3),bv(3),derbv(3,3),derxg(3),deryg(3)
dimension derdxv(3),danpldxv(3),derdnv(3)
dimension dgr2(3),dgr(3),ddgr(3,3),dbgr(3)
c
common/gr/gr2
common/dgr/dgr2,dgr,ddgr
common/ddd/dd,an2s,an2,fdia,bdotgr,ddi,ddr11
common/mode/sox
common/nplr/anpl,anpr
common/bb/bv
common/dbb/derbv
common/igrad/igrad
common/xgxg/xg
common/ygyg/yg
common/dxgyg/derxg,deryg
common/vgv/vgm,derdnm
common/dersdst/dersdst
common/ierr/ierr
common/anv/anv
common/xv/xv
common/idst/idst
c
xx=y(1)
yy=y(2)
zz=y(3)
xv(1)=y(1)
xv(2)=y(2)
xv(3)=y(3)
c
anv(1) = y(4)
anv(2) = y(5)
anv(3) = y(6)
c
C rr=sqrt(xx**2+yy**2)
C phi=acos(xx/rr)
C if (yy.lt.0.0d0) then
C phi=-phi
C end if
c
call plas_deriv(xx,yy,zz)
c
an2=anv(1)*anv(1)+anv(2)*anv(2)+anv(3)*anv(3)
anpl=anv(1)*bv(1)+anv(2)*bv(2)+anv(3)*bv(3)
c
if(abs(anpl).gt.0.99d0) then
if(abs(anpl).le.1.05d0) then
ierr=97
else
ierr=98
end if
end if
c
anpl2=anpl*anpl
dnl=1.0d0-anpl2
anpr2=an2-anpl2
anpr=0.0d0
if(anpr2.gt.0.0d0) anpr=sqrt(anpr2)
yg2=yg**2
c
an2s=1.0d0
dan2sdxg=0.0d0
dan2sdyg=0.0d0
dan2sdnpl=0.0d0
del=0.0d0
fdia=0.0d0
dfdiadnpl=0.0d0
dfdiadxg=0.0d0
dfdiadyg=0.0d0
c
duh=1.0d0-xg-yg2
if(xg.gt.0.0d0) then
del=sqrt(dnl*dnl+4.0d0*anpl*anpl*(1.0d0-xg)/yg2)
an2s=1.0d0-xg -xg*yg2*(1.0d0+anpl2+sox*del)/duh/2.0d0
c
dan2sdxg=-yg2*(1.0d0-yg2)*(1.0d0+anpl2+sox*del)/duh**2/2.0d0
. +sox*xg*anpl2/(del*duh)-1.0d0
dan2sdyg=-xg*yg*(1.0d0-xg)*(1.0d0+anpl2+sox*del)/duh**2
. +2.0d0*sox*xg*(1.0d0-xg)*anpl2/(yg*del*duh)
dan2sdnpl=-xg*yg2*anpl/duh
. -sox*xg*anpl*(2.0d0*(1.0d0-xg)-yg2*dnl)/(del*duh)
c
if(igrad.gt.0) then
ddelnpl2=2.0d0*(2.0d0*(1.0d0-xg)*(1.0d0+3.0d0*anpl2**2)
. -yg2*dnl**3)/yg2/del**3
fdia=-xg*yg2*(1.0d0+sox*ddelnpl2/2.0d0)/duh
derdel=2.0d0*(1.0d0-xg)*anpl2*(1.0d0+3.0d0*anpl2**2)
. -dnl**2*(1.0d0+3.0d0*anpl2)*yg2
derdel=4.0d0*derdel/(yg**5*del**5)
ddelnpl2y=2.0d0*(1.0d0-xg)*derdel
ddelnpl2x=yg*derdel
dfdiadnpl=24.0d0*sox*xg*(1.0d0-xg)*anpl*(1.0d0-anpl**4)
. /(yg2*del**5)
dfdiadxg=-yg2*(1.0d0-yg2)/duh**2-sox*yg2*((1.0d0-yg2)*ddelnpl2
. +xg*duh*ddelnpl2x)/(2.0d0*duh**2)
dfdiadyg=-2.0d0*yg*xg*(1.0d0-xg)/duh**2
. -sox*xg*yg*(2.0d0*(1.0d0-xg)*ddelnpl2
. +yg*duh*ddelnpl2y)/(2.0d0*duh**2)
c
end if
end if
c
bdotgr=0.0d0
do iv=1,3
bdotgr=bdotgr+bv(iv)*dgr(iv)
dbgr(iv)=0.0d0
do jv=1,3
dbgr(iv)=dgr(jv)*derbv(jv,iv)+bv(jv)*ddgr(jv,iv)
end do
end do
c
derdnm=0.0d0
c
do iv=1,3
danpldxv(iv)=anv(1)*derbv(1,iv)+anv(2)*derbv(2,iv)
. +anv(3)*derbv(3,iv)
derdxv(iv)=-(derxg(iv)*dan2sdxg
. +deryg(iv)*dan2sdyg+danpldxv(iv)*dan2sdnpl)
derdxv(iv)=derdxv(iv)-igrad*dgr2(iv)
c
derdxv(iv)=derdxv(iv)+fdia*bdotgr*dbgr(iv)+0.5d0*bdotgr**2*
. (derxg(iv)*dfdiadxg+deryg(iv)*dfdiadyg+danpldxv(iv)*dfdiadnpl)
c
derdnv(iv)=2.0d0*anv(iv)-bv(iv)*dan2sdnpl
. +0.5d0*bdotgr**2*bv(iv)*dfdiadnpl
c
derdnm=derdnm+derdnv(iv)**2
end do
c
derdnm=sqrt(derdnm)
c
derdom=-2.0d0*an2+2.0d0*xg*dan2sdxg+yg*dan2sdyg+anpl*dan2sdnpl
. +2.0d0*igrad*gr2
. -bdotgr**2*(fdia+xg*dfdiadxg+yg*dfdiadyg/2.0d0
. +anpl*dfdiadnpl/2.0d0)
c
if (idst.eq.0) then
c integration variable: s
denom=-derdnm
else if (idst.eq.1) then
c integration variable: c*t
denom=derdom
else
c integration variable: Sr
denom=-(anv(1)*derdnv(1)+anv(2)*derdnv(2)+anv(3)*derdnv(3))
end if
c
c coefficient for integration in s
c ds/dst, where st is the integration variable
dersdst=-derdnm/denom
c
dery(1) = -derdnv(1)/denom
dery(2) = -derdnv(2)/denom
dery(3) = -derdnv(3)/denom
dery(4) = derdxv(1)/denom
dery(5) = derdxv(2)/denom
dery(6) = derdxv(3)/denom
c
c vgv : ~ group velocity
c
vgm=0
do iv=1,3
vgv(iv)=-derdnv(iv)/derdom
vgm=vgm+vgv(iv)**2
end do
vgm=sqrt(vgm)
c
c dd : dispersion relation (real part)
c ddi : dispersion relation (imaginary part)
c
dd=an2-an2s-igrad*(gr2-0.5d0*bdotgr**2*fdia)
ddi=derdnv(1)*dgr(1)+derdnv(2)*dgr(2)+derdnv(3)*dgr(3)
c
return
end
c
c
c
subroutine plas_deriv(xx,yy,zz)
implicit real*8 (a-h,o-z)
parameter(pi=3.14159265358979d0)
dimension bv(3),derxg(3),deryg(3),derbv(3,3),dbtot(3)
dimension bvc(3),dbvcdc(3,3),dbvdc(3,3),dbv(3,3)
c
common/parbres/bres
common/parpl/brr,bphi,bzz,ajphi
common/btot/btot
common/bb/bv
common/dbb/derbv
common/xgxg/xg
common/dxgdps/dxgdpsi
common/ygyg/yg
common/dxgyg/derxg,deryg
common/iieq/iequil
common/derip/dpsidr,dpsidz,ddpsidrr,ddpsidzz,ddpsidrz,fpolv,ffpv
common/psival/psinv
common/sgnib/sgnbphi,sgniphi
c
xg=0.0d0
yg=9.9d1
c
do iv=1,3
derxg(iv)=0.0d0
deryg(iv)=0.0d0
bv(iv)=0.0d0
dbtot(iv)=0.0d0
do jv=1,3
dbv(iv,jv)=0.0d0
derbv(iv,jv)=0.0d0
dbvcdc(iv,jv)=0.0d0
dbvcdc(iv,jv)=0.0d0
dbvdc(iv,jv)=0.0d0
end do
end do
c
if(iequil.eq.0) return
c
c cylindrical coordinates
c
rr2=xx**2+yy**2
rr=sqrt(rr2)
csphi=xx/rr
snphi=yy/rr
c
bv(1)=-snphi*sgnbphi
bv(2)=csphi*sgnbphi
c
c convert from cm to meters
c
zzm=1.0d-2*zz
rrm=1.0d-2*rr
c
if(iequil.eq.1) then
call equian(rrm,zzm)
yg=fpolv/(rrm*bres)
end if
c
if(iequil.eq.2) then
call equinum(rrm,zzm)
call sub_xg_derxg
yg=fpolv/(rrm*bres)
bphi=fpolv/rrm
btot=abs(bphi)
if(psinv.lt.0.0d0) return
end if
c
c B = f(psi)/R e_phi+ grad psi x e_phi/R
c
c bvc(i) = B_i in cylindrical coordinates
c bv(i) = B_i in cartesian coordinates
c
bphi=fpolv/rrm
brr=-dpsidz/rrm
bzz= dpsidr/rrm
c
dfpolv=ffpv/fpolv
c
bvc(1)=brr
bvc(2)=bphi
bvc(3)=bzz
c
bv(1)=bvc(1)*csphi-bvc(2)*snphi
bv(2)=bvc(1)*snphi+bvc(2)*csphi
bv(3)=bvc(3)
c
b2tot=bv(1)**2+bv(2)**2+bv(3)**2
btot=sqrt(b2tot)
c
c dbvcdc(iv,jv) = d Bcil(iv) / dxvcil(jv)
c
dbvcdc(1,1)=-ddpsidrz/rrm-brr/rrm
dbvcdc(1,3)=-ddpsidzz/rrm
dbvcdc(2,1)= dfpolv*dpsidr/rrm-bphi/rrm
dbvcdc(2,3)= dfpolv*dpsidz/rrm
dbvcdc(3,1)= ddpsidrr/rrm-bzz/rrm
dbvcdc(3,3)= ddpsidrz/rrm
c
c dbvdc(iv,jv) = d Bcart(iv) / dxvcil(jv)
c
dbvdc(1,1) = dbvcdc(1,1)*csphi-dbvcdc(2,1)*snphi
dbvdc(1,2) = -bv(2)
dbvdc(1,3) = dbvcdc(1,3)*csphi-dbvcdc(2,3)*snphi
dbvdc(2,1) = dbvcdc(1,1)*snphi+dbvcdc(2,1)*csphi
dbvdc(2,2) = bv(1)
dbvdc(2,3) = dbvcdc(1,3)*snphi+dbvcdc(2,3)*csphi
dbvdc(3,1) = dbvcdc(3,1)
dbvdc(3,2) = dbvcdc(3,2)
dbvdc(3,3) = dbvcdc(3,3)
c
drrdx=csphi
drrdy=snphi
dphidx=-snphi/rrm
dphidy=csphi/rrm
c
c dbv(iv,jv) = d Bcart(iv) / dxvcart(jv)
c
dbv(1,1)=drrdx*dbvdc(1,1)+dphidx*dbvdc(1,2)
dbv(1,2)=drrdy*dbvdc(1,1)+dphidy*dbvdc(1,2)
dbv(1,3)=dbvdc(1,3)
dbv(2,1)=drrdx*dbvdc(2,1)+dphidx*dbvdc(2,2)
dbv(2,2)=drrdy*dbvdc(2,1)+dphidy*dbvdc(2,2)
dbv(2,3)=dbvdc(2,3)
dbv(3,1)=drrdx*dbvdc(3,1)+dphidx*dbvdc(3,2)
dbv(3,2)=drrdy*dbvdc(3,1)+dphidy*dbvdc(3,2)
dbv(3,3)=dbvdc(3,3)
c
dbtot(1)=(bv(1)*dbv(1,1)+bv(2)*dbv(2,1)+bv(3)*dbv(3,1))/btot
dbtot(2)=(bv(1)*dbv(1,2)+bv(2)*dbv(2,2)+bv(3)*dbv(3,2))/btot
dbtot(3)=(bv(1)*dbv(1,3)+bv(2)*dbv(2,3)+bv(3)*dbv(3,3))/btot
c
yg=btot/Bres
c
c convert spatial derivatives from dummy/m -> dummy/cm
c to be used in fwork
c
c bv(i) = B_i / B ; derbv(i,j) = d (B_i / B) /d x,y,z
c
do iv=1,3
deryg(iv)=1.0d-2*dbtot(iv)/Bres
bv(iv)=bv(iv)/btot
do jv=1,3
derbv(iv,jv)=1.0d-2*(dbv(iv,jv)-bv(iv)*dbtot(jv))/btot
end do
end do
c
derxg(1)=1.0d-2*drrdx*dpsidr*dxgdpsi
derxg(2)=1.0d-2*drrdy*dpsidr*dxgdpsi
derxg(3)=1.0d-2*dpsidz*dxgdpsi
c
c current density computation in Ampere/m^2
c ccj==1/mu_0
c
ccj=1.0d+7/(4.0d0*pi)
ajphi=ccj*(dbvcdc(1,3)-dbvcdc(3,1))
c ajr=ccj*(dbvcdc(3,2)/rrm-dbvcdc(2,3))
c ajz=ccj*(bvc(2)/rrm+dbvcdc(2,1)-dbvcdc(1,2))
c
return
end
c
c
c
subroutine equian(rrm,zzm)
implicit real*8 (a-h,o-z)
c
common/parqq/q0,qa,alq
common/parban/b0,rr0m,zr0m,rpam
common/psival/psinv
common/pareq1/psia
common/densbnd/psdbnd
common/derip/dpsidr,dpsidz,ddpsidrr,ddpsidzz,ddpsidrz,fpolv,ffpv
common/xgxg/xg
common/dxgdps/dxgdpsi
common/xgcn/xgcn
common/dens/dens,ddens
common/sgnib/sgnbphi,sgniphi
common/bmxmn/bmxi,bmni
common/fc/fci
common/iipr/iprof
c
if(iprof.eq.0) psdbnd=1.0d0
c
dpsidrp=0.0d0
d2psidrp=0.0d0
c
c simple model for equilibrium
c
rpm=sqrt((rrm-rr0m)**2+(zzm-zr0m)**2)
rn=rpm/rpam
c
snt=0.0d0
cst=1.0d0
if (rpm.gt.0.0d0) then
snt=(zzm-zr0m)/rpm
cst=(rrm-rr0m)/rpm
end if
c
c valore fittizio di psinv e di psia:
psinv=rn**2
psia=sgniphi
c
sgn=sgniphi*sgnbphi
if(rn.le.1.0d0) then
qq=q0+(qa-q0)*rn**alq
dpsidrp=B0*rpam*rn/qq*sgn
dqq=alq*(qa-q0)*rn**(alq-1.0d0)
d2psidrp=B0*(1.0d0-rn*dqq/qq)/qq*sgn
else
dpsidrp=B0*rpam/qa/rn*sgn
d2psidrp=-B0/qa/rn**2 *sgn
end if
c
fpolv=sgnbphi*b0*rr0m
dfpolv=0.0d0
ffpv=sgniphi*fpolv*dfpolv
c
dpsidr=dpsidrp*cst
dpsidz=dpsidrp*snt
ddpsidrr=dpsidrp*snt**2/rpm+cst**2*d2psidrp
ddpsidrz=cst*snt*(d2psidrp-dpsidrp/rpm)
ddpsidzz=dpsidrp*cst**2/rpm+snt**2*d2psidrp
c
dens=0.0d0
xg=0.0d0
dxgdpsi=0.0d0
if(psinv.lt.psdbnd) then
call density(psinv)
end if
xg=xgcn*dens
ddensdrp=2.0d0*rn*ddens
if(dpsidrp.ne.0.0d0) dxgdpsi=xgcn*ddensdrp/(dpsidrp*rpam)
c
bmax=sqrt(fpolv**2+dpsidrp**2)/(rr0m-rpam*rn)
bmin=sqrt(fpolv**2+dpsidrp**2)/(rr0m+rpam*rn)
c
return
end
c
c
c
subroutine equinum(rpsim,zpsim)
implicit real*8 (a-h,o-z)
parameter(nnw=501,nnh=501)
parameter(nrest=nnw+4,nzest=nnh+4)
parameter(lwrk=8,liwrk=2)
dimension ccspl(nnw*nnh)
dimension tr(nrest),tz(nzest),wrk(lwrk),iwrk(liwrk)
dimension rrs(1),zzs(1),ffspl(1)
parameter(lw10=nnw*3+nnh*4+nnw*nnh,lw01=nnw*4+nnh*3+nnw*nnh)
parameter(lw20=nnw*2+nnh*4+nnw*nnh,lw02=nnw*4+nnh*2+nnw*nnh)
parameter(lw11=nnw*3+nnh*3+nnw*nnh)
parameter(nrs=1,nzs=1)
dimension cc01(lw10),cc10(lw01),cc02(lw02),cc20(lw20),cc11(lw11)
dimension tfp(nrest),cfp(nrest),wrkfd(nrest)
c
common/eqnn/nr,nz,npp,nintp
common/psival/psinv
common/derip/dpsidr,dpsidz,ddpsidrr,ddpsidzz,ddpsidrz,fpolv,ffpv
common/pareq1/psia
common/pareq2/btaxis,rmaxis,zmaxis,rmnm,rmxm,zmnm,zmxm,dr,dz
common/pareq1t/psiant,psinop
c
common/coffeqt/tr,tz
common/coffeqtp/tfp
common/coffeq/ccspl
common/coffeqd/cc01,cc10,cc20,cc02,cc11
common/coffeqn/nsrt,nszt,nsft
common/cofffp/cfp
common/fpas/fpolas
c
psinv=-1.0d0
c
dpsidr=0.0d0
dpsidz=0.0d0
ddpsidrr=0.0d0
ddpsidzz=0.0d0
ddpsidrz=0.0d0
c
c here lengths are measured in meters
c
fpolv=fpolas
ffpv=0.0d0
c
if (rpsim.gt.rmxm.or.rpsim.lt.rmnm) return
if (zpsim.gt.zmxm.or.zpsim.lt.zmnm) return
c
rrs(1)=rpsim
zzs(1)=zpsim
nsr=nsrt
nsz=nszt
call fpbisp(tr,nsr,tz,nsz,ccspl,3,3,
. rrs,nrs,zzs,nzs,ffspl,wrk(1),wrk(5),iwrk(1),iwrk(2))
psinv=(ffspl(1)-psinop)/psiant
if(psinv.lt.0.0d0)
. print'(a,3e12.4)', ' psin < 0 , R, z ',psinv,rpsim,zpsim
c
nur=1
nuz=0
kkr=3-nur
kkz=3-nuz
iwr=1+(nr-nur-4)*(nz-nuz-4)
iwz=iwr+4-nur
call fpbisp(tr(nur+1),nsr-2*nur,tz(nuz+1),nsz-2*nuz,cc10,kkr,kkz,
. rrs,nrs,zzs,nzs,ffspl,cc10(iwr),cc10(iwz),iwrk(1),iwrk(2))
dpsidr= ffspl(1)*psia
c
nur=0
nuz=1
kkr=3-nur
kkz=3-nuz
iwr=1+(nr-nur-4)*(nz-nuz-4)
iwz=iwr+4-nur
call fpbisp(tr(nur+1),nsr-2*nur,tz(nuz+1),nsz-2*nuz,cc01,kkr,kkz,
. rrs,nrs,zzs,nzs,ffspl,cc01(iwr),cc01(iwz),iwrk(1),iwrk(2))
dpsidz= ffspl(1)*psia
c
nur=2
nuz=0
kkr=3-nur
kkz=3-nuz
iwr=1+(nr-nur-4)*(nz-nuz-4)
iwz=iwr+4-nur
call fpbisp(tr(nur+1),nsr-2*nur,tz(nuz+1),nsz-2*nuz,cc20,kkr,kkz,
. rrs,nrs,zzs,nzs,ffspl,cc20(iwr),cc20(iwz),iwrk(1),iwrk(2))
ddpsidrr= ffspl(1)*psia
c
nur=0
nuz=2
kkr=3-nur
kkz=3-nuz
iwr=1+(nr-nur-4)*(nz-nuz-4)
iwz=iwr+4-nur
call fpbisp(tr(nur+1),nsr-2*nur,tz(nuz+1),nsz-2*nuz,cc02,kkr,kkz,
. rrs,nrs,zzs,nzs,ffspl,cc02(iwr),cc02(iwz),iwrk(1),iwrk(2))
ddpsidzz= ffspl(1)*psia
c
nur=1
nuz=1
kkr=3-nur
kkz=3-nuz
iwr=1+(nr-nur-4)*(nz-nuz-4)
iwz=iwr+4-nur
call fpbisp(tr(nur+1),nsr-2*nur,tz(nuz+1),nsz-2*nuz,cc11,kkr,kkz,
. rrs,nrs,zzs,nzs,ffspl,cc11(iwr),cc11(iwz),iwrk(1),iwrk(2))
ddpsidrz= ffspl(1)*psia
c
if(psinv.le.1.0d0.and.psinv.gt.0.0d0) then
rrs(1)=psinv
call splev(tfp,nsft,cfp,3,rrs,ffspl,1,ier)
fpolv=ffspl(1)
nu=1
call splder(tfp,nsft,cfp,3,nu,rrs,ffspl,1,wrkfd,ier)
dfpolv=ffspl(1)
ffpv=fpolv*dfpolv/psia
end if
c
return
end
c
c
c
subroutine bfield(rpsim,zpsim,bphi,brr,bzz)
implicit real*8 (a-h,o-z)
common/derip/dpsidr,dpsidz,ddpsidrr,ddpsidzz,ddpsidrz,fpolv,ffpv
call equinum(rpsim,zpsim)
bphi=fpolv/rpsim
brr=-dpsidz/rpsim
bzz= dpsidr/rpsim
return
end
c
subroutine tor_curr_psi(h,ajphi)
implicit real*8 (a-h,o-z)
common/pareq2/btaxis,rmaxis,zmaxis,rmnm,rmxm,zmnm,zmxm,dr,dz
call psi_raxis(h,r1,r2)
call tor_curr(r2,zmaxis,ajphi)
return
end
c
subroutine tor_curr(rpsim,zpsim,ajphi)
implicit real*8 (a-h,o-z)
parameter(pi=3.14159265358979d0,ccj=1.0d+7/(4.0d0*pi))
common/derip/dpsidr,dpsidz,ddpsidrr,ddpsidzz,ddpsidrz,fpolv,ffpv
call equinum(rpsim,zpsim)
bzz= dpsidr/rpsim
dbvcdc13=-ddpsidzz/rpsim
dbvcdc31= ddpsidrr/rpsim-bzz/rpsim
ajphi=ccj*(dbvcdc13-dbvcdc31)
return
end
c
subroutine psi_raxis(h,r1,r2)
implicit real*8 (a-h,o-z)
parameter(mest=4,kspl=3)
parameter(nnw=501,nnh=501)
parameter(nrest=nnw+4,nzest=nnh+4)
dimension cc(nnw*nnh),tr(nrest),tz(nzest)
dimension czc(nrest),zeroc(mest)
c
common/pareq1t/psiant,psinop
common/pareq2/btaxis,rmaxis,zmaxis,rmnm,rmxm,zmnm,zmxm,dr,dz
common/coffeqn/nsr,nsz,nsft
common/coffeq/cc
common/coffeqt/tr,tz
c
iopt=1
zc=zmaxis
call profil(iopt,tr,nsr,tz,nsz,cc,kspl,kspl,zc,nsr,czc,ier)
if(ier.gt.0) print*,' profil =',ier
val=h*psiant+psinop
call sproota(val,tr,nsr,czc,zeroc,mest,m,ier)
r1=zeroc(1)
r2=zeroc(2)
return
end
c
c
c
subroutine sub_xg_derxg
implicit real*8 (a-h,o-z)
common/psival/psinv
common/pareq1/psia
common/xgxg/xg
common/dxgdps/dxgdpsi
common/xgcn/xgcn
common/dens/dens,ddenspsin
xg=0.0d0
dxgdpsi=0.0d0
c if(psinv.le.psdbnd.and.psinv.ge.0) then
call density(psinv)
xg=xgcn*dens
dxgdpsi=xgcn*ddenspsin/psia
c end if
return
end
c
c
c
subroutine density(arg)
implicit real*8 (a-h,o-z)
parameter(npmx=250,npest=npmx+4)
dimension xxs(1),ffs(1)
dimension tfn(npest),cfn(npest),wrkfd(npest)
c
common/densbnd/psdbnd
common/denspp/psnpp,aad,bbd,ccd
common/iipr/iprof
common/pardens/dens0,aln1,aln2
common/dens/dens,ddens
common/coffdt/tfn
common/coffdnst/nsfd
common/cofffn/cfn
c
c computation of density [10^19 m^-3] and derivative wrt psi
c
dens=0.0d0
ddens=0.0d0
if(arg.gt.psdbnd.or.arg.lt.0.0d0) return
c
if(iprof.eq.0) then
if(arg.gt.1.0d0) return
profd=(1.0d0-arg**aln1)**aln2
dens=dens0*profd
dprofd=-aln1*aln2*arg**(aln1-1.0d0)
. *(1.0d0-arg**aln1)**(aln2-1.0d0)
ddens=dens0*dprofd
else
if(arg.le.psdbnd.and.arg.gt.psnpp) then
c
c cubic interpolation for 1 < psi < psdbnd
c
nn=3
nn1=nn+1
nn2=nn+2
dpsib=arg-psdbnd
dens=aad*dpsib**nn+bbd*dpsib**nn1+ccd*dpsib**nn2
ddens=nn*aad*dpsib**(nn-1)+nn1*bbd*dpsib**nn
. +nn2*ccd*dpsib**nn1
else
xxs(1)=arg
ier=0
call splev(tfn,nsfd,cfn,3,xxs,ffs,1,ier)
dens=ffs(1)
nu=1
ier=0
call splder(tfn,nsfd,cfn,3,nu,xxs,ffs,1,wrkfd,ier)
ddens=ffs(1)
if(ier.gt.0) print*,ier
if(abs(dens).lt.1.0d-10) dens=0.0d0
end if
if(dens.lt.0.0d0) print*,' DENSITY NEGATIVE',dens
c
end if
return
end
c
c
c
function temp(arg)
implicit real*8 (a-h,o-z)
parameter(npmx=250)
dimension psrad(npmx),derad(npmx),terad(npmx),zfc(npmx),ct(npmx,4)
c
common/parqte/te0,dte0,alt1,alt2
common/iipr/iprof
common/crad/psrad,derad,terad,zfc
common/coffte/ct
common/eqnn/nr,nz,npp,nintp
c
temp=0.0d0
if(arg.ge.1.0d0.or.arg.lt.0.0d0) return
if(iprof.eq.0) then
proft=(1.0d0-arg**alt1)**alt2
temp=(te0-dte0)*proft+dte0
else
call locate(psrad,npp,arg,k)
if(k.eq.0) k=1
if(k.eq.npp) k=npp-1
dps=arg-psrad(k)
temp=spli(ct,npmx,k,dps)
endif
return
end
c
c
c
function fzeff(arg)
implicit real*8 (a-h,o-z)
parameter(npmx=250)
dimension psrad(npmx),derad(npmx),terad(npmx),zfc(npmx),cz(npmx,4)
c
common/iipr/iprof
common/crad/psrad,derad,terad,zfc
common/coffz/cz
common/eqnn/nr,nz,npp,nintp
common/zz/Zeff
c
fzeff=1
ps=arg
if(ps.gt.1.0d0.and.ps.lt.0.0d0) return
if(iprof.eq.0) then
fzeff=zeff
else
call locate(psrad,npp,ps,k)
if(k.eq.0) k=1
if(k.eq.npp) k=npp-1
dps=ps-psrad(k)
fzeff=spli(cz,npmx,k,dps)
endif
return
end
c
c beam tracing initial conditions igrad=1
c
subroutine ic_gb
implicit real*8 (a-h,o-z)
parameter(ndim=6,ndimm=3)
parameter(jmx=31,kmx=36,zero=0.0d0,izero=0,one=1.0d0)
parameter(pi=3.14159265358979d0,cvdr=pi/180.0d0)
dimension ywrk0(ndim,jmx,kmx),ypwrk0(ndim,jmx,kmx)
dimension xc0(ndimm,jmx,kmx),du10(ndimm,jmx,kmx)
dimension dffiu(jmx),ddffiu(jmx)
dimension grad2(jmx,kmx),dgrad2v(ndimm,jmx,kmx)
dimension gri(3,jmx,kmx),ggri(3,3,jmx,kmx)
complex*16 ui,sss,ddd,phic,qi1,qi2,tc,ts,qqxx,qqxy,qqyy
complex*16 dqi1,dqi2,dqqxx,dqqyy,dqqxy
complex*16 d2qi1,d2qi2,d2qqxx,d2qqyy,d2qqxy
complex*16 catand
external catand
c parameter(ui=(0.0d0,1.0d0))
c
common/nray/nrayr,nrayth
common/rwmax/rwmax
common/parwv/ak0,akinv,fhz
common/parbeam/wcsi,weta,rcicsi,rcieta,phiw,phir
common/anic/anx0c,any0c,anz0c
common/wrk/ywrk0,ypwrk0
common/grc/xc0,du10
common/fi/dffiu,ddffiu
common/mirr/x00,y00,z00
common/grad2jk/grad2
common/dgrad2jk/dgrad2v
common/gradjk/gri
common/ggradjk/ggri
common/ddd/dd,an2s,an2,fdia,bdotgr,ddi,ddr11
c
ui=(0.0d0,1.0d0)
csth=anz0c
snth=sqrt(1.0d0-csth**2)
csps=1.0d0
snps=0.0d0
if(snth.gt.0.0d0) then
csps=any0c/snth
snps=anx0c/snth
end if
c
phiwrad=phiw*cvdr
phirrad=phir*cvdr
csphiw=cos(phiwrad)
snphiw=sin(phiwrad)
c csphir=cos(phirrad)
c snphir=sin(phirrad)
c
wwcsi=2.0d0*akinv/wcsi**2
wweta=2.0d0*akinv/weta**2
c
if(phir.ne.phiw) then
sk=(rcicsi+rcieta)
sw=(wwcsi+wweta)
dk=(rcicsi-rcieta)
dw=(wwcsi-wweta)
ts=-(dk*sin(2.0d0*phirrad)-ui*dw*sin(2.0d0*phiwrad))
tc=(dk*cos(2.0d0*phirrad)-ui*dw*cos(2.0d0*phiwrad))
phic=0.5d0*catand(ts/tc)
ddd=dk*cos(2*(phirrad+phic))-ui*dw*cos(2*(phiwrad+phic))
sss=sk-ui*sw
qi1=0.5d0*(sss+ddd)
qi2=0.5d0*(sss-ddd)
rci1=dble(qi1)
ww1=-dimag(qi1)
rci2=dble(qi2)
ww2=-dimag(qi2)
else
rci1=rcicsi
rci2=rcieta
ww1=wwcsi
ww2=wweta
phic=-phiwrad
qi1=rci1-ui*ww1
qi2=rci2-ui*ww2
end if
c w01=sqrt(2.0d0*akinv/ww1)
c z01=-rci1/(rci1**2+ww1**2)
c w02=sqrt(2.0d0*akinv/ww2)
c z02=-rci2/(rci2**2+ww2**2)
qqxx=qi1*cos(phic)**2+qi2*sin(phic)**2
qqyy=qi1*sin(phic)**2+qi2*cos(phic)**2
qqxy=-(qi1-qi2)*sin(2.0d0*phic)
wwxx=-dimag(qqxx)
wwyy=-dimag(qqyy)
wwxy=-dimag(qqxy)/2.0d0
rcixx=dble(qqxx)
rciyy=dble(qqyy)
rcixy=dble(qqxy)/2.0d0
dqi1=-qi1**2
dqi2=-qi2**2
d2qi1=2*qi1**3
d2qi2=2*qi2**3
dqqxx=dqi1*cos(phic)**2+dqi2*sin(phic)**2
dqqyy=dqi1*sin(phic)**2+dqi2*cos(phic)**2
dqqxy=-(dqi1-dqi2)*sin(2.0d0*phic)
d2qqxx=d2qi1*cos(phic)**2+d2qi2*sin(phic)**2
d2qqyy=d2qi1*sin(phic)**2+d2qi2*cos(phic)**2
d2qqxy=-(d2qi1-d2qi2)*sin(2.0d0*phic)
dwwxx=-dimag(dqqxx)
dwwyy=-dimag(dqqyy)
dwwxy=-dimag(dqqxy)/2.0d0
d2wwxx=-dimag(d2qqxx)
d2wwyy=-dimag(d2qqyy)
d2wwxy=-dimag(d2qqxy)/2.0d0
drcixx=dble(dqqxx)
drciyy=dble(dqqyy)
drcixy=dble(dqqxy)/2.0d0
dr=1.0d0
if(nrayr.gt.1) dr=rwmax/dble(nrayr-1)
da=2.0d0*pi/dble(nrayth)
c
ddfu=2.0d0*dr**2*akinv
do j=1,nrayr
u=dble(j-1)
c ffi=u**2*ddfu/2.0d0
dffiu(j)=u*ddfu
ddffiu(j)=ddfu
do k=1,nrayth
alfak=(k-1)*da
dcsiw=dr*cos(alfak)*wcsi
detaw=dr*sin(alfak)*weta
dx0t=dcsiw*csphiw-detaw*snphiw
dy0t=dcsiw*snphiw+detaw*csphiw
x0t=u*dx0t
y0t=u*dy0t
z0t=-0.5d0*(rcixx*x0t**2+rciyy*y0t**2+2*rcixy*x0t*y0t)
c
c csiw=u*dcsiw
c etaw=u*detaw
c csir=x0t*csphir+y0t*snphir
c etar=-x0t*snphir+y0t*csphir
c
dx0= x0t*csps+snps*(y0t*csth+z0t*snth)
dy0=-x0t*snps+csps*(y0t*csth+z0t*snth)
dz0= z0t*csth-y0t*snth
x0=x00+dx0
y0=y00+dy0
z0=z00+dz0
gxt=x0t*wwxx+y0t*wwxy
gyt=x0t*wwxy+y0t*wwyy
gzt=0.5d0*(x0t**2*dwwxx+y0t**2*dwwyy)+x0t*y0t*dwwxy
gr2=gxt*gxt+gyt*gyt+gzt*gzt
gxxt=wwxx
gyyt=wwyy
gzzt=0.5d0*(x0t**2*d2wwxx+y0t**2*d2wwyy)+x0t*y0t*d2wwxy
gxyt=wwxy
gxzt=x0t*dwwxx+y0t*dwwxy
gyzt=x0t*dwwxy+y0t*dwwyy
dgr2xt=2.0d0*(gxt*gxxt+gyt*gxyt+gzt*gxzt)
dgr2yt=2.0d0*(gxt*gxyt+gyt*gyyt+gzt*gyzt)
dgr2zt=2.0d0*(gxt*gxzt+gyt*gyzt+gzt*gzzt)
dgr2x= dgr2xt*csps+snps*(dgr2yt*csth+dgr2zt*snth)
dgr2y=-dgr2xt*snps+csps*(dgr2yt*csth+dgr2zt*snth)
dgr2z= dgr2zt*csth-dgr2yt*snth
gri(1,j,k)=gxt*csps+snps*(gyt*csth+gzt*snth)
gri(2,j,k)=-gxt*snps+csps*(gyt*csth+gzt*snth)
gri(3,j,k)=gzt*csth-gyt*snth
ggri(1,1,j,k)=gxxt*csps**2+
. snps**2*(gyyt*csth**2+gzzt*snth**2+2.0d0*snth*csth*gyzt)+
. 2.0d0*snps*csps*(gxyt*csth+gxzt*snth)
ggri(2,2,j,k)=gxxt*snps**2+
. csps**2*(gyyt*csth**2+gzzt*snth**2+2.0d0*snth*csth*gyzt)-
. 2.0d0*snps*csps*(gxyt*csth+gxzt*snth)
ggri(3,3,j,k)=gzzt*csth**2+gyyt*snth**2-2.0d0*csth*snth*gyzt
ggri(1,2,j,k)=csps*snps*(-gxxt+csth**2*gyyt+snth**2*gzzt
. +2.0d0*csth*snth*gyzt)
. +(csps**2-snps**2)*(snth*gxzt+csth*gxyt)
ggri(1,3,j,k)=csth*snth*snps*(gzzt-gyyt)
. +(csth**2-snth**2)*snps*gyzt+csps*(csth*gxzt-snth*gxyt)
ggri(2,3,j,k)=csth*snth*csps*(gzzt-gyyt)
. +(csth**2-snth**2)*csps*gyzt+snps*(snth*gxyt-csth*gxzt)
ggri(2,1,j,k)=ggri(1,2,j,k)
ggri(3,1,j,k)=ggri(1,3,j,k)
ggri(3,2,j,k)=ggri(2,3,j,k)
c
du1tx=(dx0t*wwxx+dy0t*wwxy)/ddfu
du1ty=(dx0t*wwxy+dy0t*wwyy)/ddfu
du1tz=0.5d0*u*(dx0t**2*dwwxx+dy0t**2*dwwyy+
. 2.0d0*dx0t*dy0t*dwwxy)/ddfu
c
pppx=x0t*rcixx+y0t*rcixy
pppy=x0t*rcixy+y0t*rciyy
denpp=pppx*gxt+pppy*gyt
if (denpp.ne.0.0d0) then
ppx=-pppx*gzt/denpp
ppy=-pppy*gzt/denpp
else
ppx=0.0d0
ppy=0.0d0
end if
c
anzt=sqrt((1.0d0+gr2)/(1.0d0+ppx**2+ppy**2))
anxt=ppx*anzt
anyt=ppy*anzt
c
anx= anxt*csps+snps*(anyt*csth+anzt*snth)
any=-anxt*snps+csps*(anyt*csth+anzt*snth)
anz= anzt*csth-anyt*snth
c
an20=1.0d0+gr2
an0=sqrt(an20)
anx0=anx
any0=any
anz0=anz
c
xc0(1,j,k)=x0
xc0(2,j,k)=y0
xc0(3,j,k)=z0
c
ywrk0(1,j,k)=x0
ywrk0(2,j,k)=y0
ywrk0(3,j,k)=z0
ywrk0(4,j,k)=anx0
ywrk0(5,j,k)=any0
ywrk0(6,j,k)=anz0
c
ypwrk0(1,j,k) = anx0/an0
ypwrk0(2,j,k) = any0/an0
ypwrk0(3,j,k) = anz0/an0
ypwrk0(4,j,k) = dgr2x/an0/2.0d0
ypwrk0(5,j,k) = dgr2y/an0/2.0d0
ypwrk0(6,j,k) = dgr2z/an0/2.0d0
c
grad2(j,k)=gr2
dgrad2v(1,j,k)=dgr2x
dgrad2v(2,j,k)=dgr2y
dgrad2v(3,j,k)=dgr2z
c
du10(1,j,k)= du1tx*csps+snps*(du1ty*csth+du1tz*snth)
du10(2,j,k)=-du1tx*snps+csps*(du1ty*csth+du1tz*snth)
du10(3,j,k)= du1tz*csth-du1ty*snth
c
dd=anx0**2+any0**2+anz0**2-an20
vgradi=anxt*gxt+anyt*gyt+anzt*gzt
ddi=2.0d0*vgradi
c
if(j.eq.nrayr) then
r0=sqrt(x0**2+y0**2)
x0m=x0/1.0d2
y0m=y0/1.0d2
r0m=r0/1.0d2
z0m=z0/1.0d2
write(33,111) izero,j,k,zero,x0m,y0m,r0m,z0m,
. -1.0d0,zero,zero,zero,one
end if
if(j.eq.1.and.k.eq.1) then
write(4,99) zero,r0m,z0m,atan2(y0m,x0m)*180.0d0/pi,
. zero,zero,zero,zero,
. zero,zero,zero,zero,one,zero,zero,
. zero,zero,one,zero,zero,zero,zero,one
ddr110=dd
end if
if(j.eq.nrayr.and.k.eq.1) then
write(17,99) zero,ddr110,dd,ddi
end if
end do
end do
c
call pweigth
c
if(nrayr.gt.1) then
iproj=0
nfilp=8
call projxyzt(iproj,nfilp)
end if
c
return
99 format(24(1x,e16.8e3))
111 format(3i5,20(1x,e16.8e3))
end
c
c ray tracing initial conditions igrad=0
c
subroutine ic_rt
implicit real*8 (a-h,o-z)
parameter(ndim=6,ndimm=3)
parameter(jmx=31,kmx=36,zero=0.0d0,izero=0,one=1.0d0)
parameter(pi=3.14159265358979d0,cvdr=pi/180.0d0)
dimension ywrk0(ndim,jmx,kmx),ypwrk0(ndim,jmx,kmx)
dimension xc0(ndimm,jmx,kmx),du10(ndimm,jmx,kmx)
dimension dffiu(jmx),ddffiu(jmx)
dimension grad2(jmx,kmx),dgrad2v(ndimm,jmx,kmx)
dimension gri(3,jmx,kmx),ggri(3,3,jmx,kmx)
c
common/nray/nrayr,nrayth
common/rwmax/rwmax
common/parbeam/wcsi,weta,rcicsi,rcieta,phiw,phir
common/anic/anx0c,any0c,anz0c
common/wrk/ywrk0,ypwrk0
common/grc/xc0,du10
common/fi/dffiu,ddffiu
common/mirr/x00,y00,z00
common/grad2jk/grad2
common/dgrad2jk/dgrad2v
common/gradjk/gri
common/ggradjk/ggri
common/ddd/dd,an2s,an2,fdia,bdotgr,ddi,ddr11
c
csth=anz0c
snth=sqrt(1.0d0-csth**2)
csps=1.0d0
snps=0.0d0
if(snth.gt.0.0d0) then
csps=any0c/snth
snps=anx0c/snth
end if
c
phiwrad=phiw*cvdr
csphiw=cos(phiwrad)
snphiw=sin(phiwrad)
c
dr=1.0d0
if(nrayr.gt.1) dr=rwmax/dble(nrayr-1)
da=2.0d0*pi/dble(nrayth)
z0t=0.0d0
c
do j=1,nrayr
u=dble(j-1)
dffiu(j)=0.0d0
ddffiu(j)=0.0d0
do k=1,nrayth
alfak=(k-1)*da
dcsiw=dr*cos(alfak)*wcsi
detaw=dr*sin(alfak)*weta
dx0t=dcsiw*csphiw-detaw*snphiw
dy0t=dcsiw*snphiw+detaw*csphiw
x0t=u*dx0t
y0t=u*dy0t
c
c csiw=u*dcsiw
c etaw=u*detaw
c csir=csiw
c etar=etaw
c
dx0= x0t*csps+snps*(y0t*csth+z0t*snth)
dy0=-x0t*snps+csps*(y0t*csth+z0t*snth)
dz0= z0t*csth-y0t*snth
c
x0=x00+dx0
y0=y00+dy0
z0=z00+dz0
c
ppcsi=u*dr*cos(alfak)*rcicsi
ppeta=u*dr*sin(alfak)*rcieta
c
anzt=1.0d0/sqrt(1.0d0+ppcsi**2+ppeta**2)
ancsi=ppcsi*anzt
aneta=ppeta*anzt
c
anxt=ancsi*csphiw-aneta*snphiw
anyt=ancsi*snphiw+aneta*csphiw
c
anx= anxt*csps+snps*(anyt*csth+anzt*snth)
any=-anxt*snps+csps*(anyt*csth+anzt*snth)
anz= anzt*csth-anyt*snth
c
an20=1.0d0
an0=sqrt(an20)
anx0=anx
any0=any
anz0=anz
c
xc0(1,j,k)=x0
xc0(2,j,k)=y0
xc0(3,j,k)=z0
c
ywrk0(1,j,k)=x0
ywrk0(2,j,k)=y0
ywrk0(3,j,k)=z0
ywrk0(4,j,k)=anx0
ywrk0(5,j,k)=any0
ywrk0(6,j,k)=anz0
c
ypwrk0(1,j,k) = anx0/an0
ypwrk0(2,j,k) = any0/an0
ypwrk0(3,j,k) = anz0/an0
ypwrk0(4,j,k) = 0.0d0
ypwrk0(5,j,k) = 0.0d0
ypwrk0(6,j,k) = 0.0d0
c
do iv=1,3
gri(iv,j,k)=0.0d0
dgrad2v(iv,j,k)=0.0d0
du10(iv,j,k)=0.0d0
do jv=1,3
ggri(iv,jv,j,k)=0.0d0
end do
end do
grad2(j,k)=0.0d0
c
dd=anx0**2+any0**2+anz0**2-an20
vgradi=0.0d0
ddi=2.0d0*vgradi
c
if(j.eq.nrayr) then
r0=sqrt(x0**2+y0**2)
x0m=x0/1.0d2
y0m=y0/1.0d2
r0m=r0/1.0d2
z0m=z0/1.0d2
write(33,111) izero,j,k,zero,x0m,y0m,r0m,z0m,
. -1.0d0,zero,zero,zero,one
end if
if(j.eq.1.and.k.eq.1) then
write(17,99) zero,zero,zero,zero
write(4,99) zero,r0m,z0m,atan2(y0m,x0m)*180.0d0/pi,
. zero,zero,zero,zero,
. zero,zero,zero,zero,one,zero,zero,
. zero,zero,one,zero,zero,zero,zero,one
end if
end do
end do
c
call pweigth
c
if(nrayr.gt.1) then
iproj=0
nfilp=8
call projxyzt(iproj,nfilp)
end if
c
return
99 format(24(1x,e16.8e3))
111 format(3i5,20(1x,e16.8e3))
end
subroutine ic_rt2
implicit real*8 (a-h,o-z)
parameter(ndim=6,ndimm=3)
parameter(jmx=31,kmx=36,zero=0.0d0,izero=0,one=1.0d0)
parameter(pi=3.14159265358979d0,cvdr=pi/180.0d0)
dimension ywrk0(ndim,jmx,kmx),ypwrk0(ndim,jmx,kmx)
dimension yyrfl(jmx,kmx,ndim)
dimension xc0(ndimm,jmx,kmx),du10(ndimm,jmx,kmx)
dimension dffiu(jmx),ddffiu(jmx)
dimension grad2(jmx,kmx),dgrad2v(ndimm,jmx,kmx)
dimension gri(3,jmx,kmx),ggri(3,3,jmx,kmx)
c
common/nray/nrayr,nrayth
common/wrk/ywrk0,ypwrk0
common/grc/xc0,du10
common/grad2jk/grad2
common/dgrad2jk/dgrad2v
common/gradjk/gri
common/ggradjk/ggri
common/ddd/dd,an2s,an2,fdia,bdotgr,ddi,ddr11
common/yyrfl/yyrfl
do j=1,nrayr
do k=1,nrayth
x0=yyrfl(j,k,1)
y0=yyrfl(j,k,2)
z0=yyrfl(j,k,3)
anx0=yyrfl(j,k,4)
any0=yyrfl(j,k,5)
anz0=yyrfl(j,k,6)
an20=anx0*anx0+any0*any0+anz0*anz0
an0=sqrt(an20)
c
xc0(1,j,k)=x0
xc0(2,j,k)=y0
xc0(3,j,k)=z0
c
ywrk0(1,j,k)=x0
ywrk0(2,j,k)=y0
ywrk0(3,j,k)=z0
ywrk0(4,j,k)=anx0/an0
ywrk0(5,j,k)=any0/an0
ywrk0(6,j,k)=anz0/an0
c
ypwrk0(1,j,k) = anx0/an0
ypwrk0(2,j,k) = any0/an0
ypwrk0(3,j,k) = anz0/an0
ypwrk0(4,j,k) = 0.0d0
ypwrk0(5,j,k) = 0.0d0
ypwrk0(6,j,k) = 0.0d0
c
do iv=1,3
gri(iv,j,k)=0.0d0
dgrad2v(iv,j,k)=0.0d0
du10(iv,j,k)=0.0d0
do jv=1,3
ggri(iv,jv,j,k)=0.0d0
end do
end do
grad2(j,k)=0.0d0
c
dd=anx0**2+any0**2+anz0**2-an20
vgradi=0.0d0
ddi=2.0d0*vgradi
c
if(j.eq.nrayr) then
r0=sqrt(x0**2+y0**2)
x0m=x0/1.0d2
y0m=y0/1.0d2
r0m=r0/1.0d2
z0m=z0/1.0d2
write(33,111) izero,j,k,zero,x0m,y0m,r0m,z0m,
. -1.0d0,zero,zero,zero,one
end if
if(j.eq.1.and.k.eq.1) then
write(17,99) zero,zero,zero,zero
write(4,99) zero,r0m,z0m,atan2(y0m,x0m)*180.0d0/pi,
. zero,zero,zero,zero,
. zero,zero,zero,zero,one,zero,zero,
. zero,zero,one,zero,zero,zero,zero,one
end if
end do
end do
c
call pweigth
c
if(nrayr.gt.1) then
iproj=0
nfilp=8
call projxyzt(iproj,nfilp)
end if
c
return
99 format(24(1x,e16.8e3))
111 format(3i5,20(1x,e16.8e3))
end
c
c ray power weigth coefficient q(j)
c
subroutine pweigth
implicit real*8(a-h,o-z)
parameter(jmx=31)
dimension q(jmx)
common/qw/q
common/nray/nrayr,nrayth
common/rwmax/rwmax
c
dr=1.0d0
if(nrayr.gt.1) dr=rwmax/dble(nrayr-1)
r1=0.0d0
summ=0.0d0
q(1)=1.0d0
if(nrayr.gt.1) then
do j=1,nrayr
r2=(dble(j)-0.5d0)*dr
q(j)=(exp(-2.0d0*r1**2)-exp(-2.0d0*r2**2))
r1=r2
summ=summ+q(j)
end do
c
q(1)=q(1)/summ
sm=q(1)
j=1
k=1
do j=2,nrayr
q(j)=q(j)/nrayth/summ
do k=1,nrayth
sm=sm+q(j)
end do
end do
end if
c
return
end
c
c
c
subroutine valpsispl(rpsi,voli,dervoli,areai,rrii,rbavi,
. bmxi,bmni,fci,intp)
implicit real*8 (a-h,o-z)
parameter(nnintp=101)
dimension rpstab(nnintp),cbmx(nnintp,4),cbmn(nnintp,4)
dimension cvol(nnintp,4),crri(nnintp,4),crbav(nnintp,4)
dimension carea(nnintp,4),cfc(nnintp,4)
c
common/cflav/cvol,crri,crbav,cbmx,cbmn,carea,cfc
common/pstab/rpstab
common/eqnn/nr,nz,npp,nintp
c
ip=int((nintp-1)*rpsi+1)
if(ip.eq.0) ip=1
if(ip.eq.nintp) ip=nintp-1
c
dps=rpsi-rpstab(ip)
c
areai=spli(carea,nintp,ip,dps)
voli=spli(cvol,nintp,ip,dps)
dervoli=splid(cvol,nintp,ip,dps)
rrii=spli(crri,nintp,ip,dps)
c
if(intp.eq.0) return
c
rbavi=spli(crbav,nintp,ip,dps)
bmxi=spli(cbmx,nintp,ip,dps)
bmni=spli(cbmn,nintp,ip,dps)
fci=spli(cfc,nintp,ip,dps)
c
return
end
c
c
c
subroutine ratioj(rpsi,ratjai,ratjbi,ratjpli)
implicit real*8 (a-h,o-z)
parameter(nnintp=101)
dimension rpstab(nnintp)
dimension cratja(nnintp,4),cratjb(nnintp,4),cratjpl(nnintp,4)
common/pstab/rpstab
common/eqnn/nr,nz,npp,nintp
common/cratj/cratja,cratjb,cratjpl
ip=int((nintp-1)*rpsi+1)
if(ip.eq.0) ip=1
if(ip.eq.nintp) ip=nintp-1
dps=rpsi-rpstab(ip)
ratjai=spli(cratja,nintp,ip,dps)
ratjbi=spli(cratjb,nintp,ip,dps)
ratjpli=spli(cratjpl,nintp,ip,dps)
return
end
c
c
c
subroutine pabs_curr(i,j,k)
implicit real*8 (a-h,o-z)
parameter(jmx=31,kmx=36,nmx=8000)
parameter(pi=3.14159265358979d0)
dimension psjki(jmx,kmx,nmx)
dimension tauv(jmx,kmx,nmx),alphav(jmx,kmx,nmx)
dimension pdjki(jmx,kmx,nmx),ppabs(jmx,kmx,nmx)
dimension currj(jmx,kmx,nmx),didst(jmx,kmx,nmx),ccci(jmx,kmx,nmx)
dimension q(jmx),tau1v(jmx,kmx)
c
common/psjki/psjki
common/atjki/tauv,alphav
common/dpjjki/pdjki,currj
common/pcjki/ppabs,ccci
common/dcjki/didst
common/tau1v/tau1v
c
common/qw/q
common/p0/p0mw
c
common/dsds/dst
common/dersdst/dersdst
common/iieq/iequil
c
common/parban/b0,rr0m,zr0m,rpam
common/absor/alpha,effjcd,akim,tau0
c
common/psival/psinv
common/sgnib/sgnbphi,sgniphi
common/bmxmn/bmxi,bmni
common/fc/fci
c
dvvl=1.0d0
rbavi=1.0d0
rrii=rr0m
rhop0=sqrt(psjki(j,k,i-1))
if(iequil.eq.2) then
intp=1
psinv=psjki(j,k,i)
rhop=sqrt(psinv)
call valpsispl(rhop,voli,dervoli,area,rrii,
. rbavi,bmxi,bmni,fci,intp)
dvvl=dervoli*abs(rhop-rhop0)
else
dvvl=4.0d0*pi*rr0m*pi*abs(rhop*rhop-rhop0*rhop0)*rpam**2
rbavi=b0/bmni
fci=1.0d0-1.469d0*sqrt(rpam/rr0m)
end if
if(dvvl.le.0.0d0) dvvl=1.0d0
c
adnm=2.0d0*pi*rrii
c
c calcolo della corrente cohen: currtot [MA]
c calcolo della densita' corrente cohen: currj [MA/m^2]
c calcolo della densita' potenza: pdjki [MW/m^3]
c calcolo della efficienza <j/p>: effjcdav [A m/W ]
c
tau0=tauv(j,k,i-1)
c
call ecrh_cd
c
alphav(j,k,i)=alpha
dtau=(alphav(j,k,i)+alphav(j,k,i-1))*dersdst*dst/2.0d0
tauv(j,k,i)=tauv(j,k,i-1)+dtau
dpdst=p0mw*q(j)*exp(-tauv(j,k,i)-tau1v(j,k))*
. alphav(j,k,i)*dersdst
pdjki(j,k,i)=dpdst*dst/dvvl
ppabs(j,k,i)=p0mw*q(j)*exp(-tau1v(j,k))*
. (1.0d0-exp(-tauv(j,k,i)))
effjcdav=rbavi*effjcd
currj(j,k,i)=sgnbphi*effjcdav*pdjki(j,k,i)
didst(j,k,i)=sgnbphi*effjcdav*dpdst/adnm
dcidst=(didst(j,k,i)+didst(j,k,i-1))/2.0d0
ccci(j,k,i)=ccci(j,k,i-1)+dcidst*dst
return
end
c
c
c
subroutine ecrh_cd
implicit real*8 (a-h,o-z)
real*8 mc2,mesi
parameter(taucr=12.0d0,xxcr=16.0d0,eps=1.d-8)
parameter(qesi=1.602176487d-19,mesi=9.10938215d-31)
parameter(vcsi=2.99792458d+8)
parameter(mc2 = mesi*vcsi*vcsi/qesi*1d-3)
c
common/ithn/ithn
common/nharm/nharm,nhf
common/warm/iwarm,ilarm
common/ieccd/ieccd
c
common/ygyg/yg
common/nplr/anpl,anpr
common/vgv/vgm,derdnm
common/parwv/ak0,akinv,fhz
c
common/nprw/anprre,anprim
c
common/absor/alpha,effjcd,akim,tau
c
common/psival/psinv
common/tete/tekev
common/amut/amu
common/zz/Zeff
c
c absorption computation
c
alpha=0.0d0
akim=0.0d0
effjcd=0.0d0
c
tekev=temp(psinv)
amu=mc2/tekev
zeff=fzeff(psinv)
c
if(tekev.le.0.0d0.or.tau.gt.taucr) return
c
dnl=1.0d0-anpl*anpl
if(iwarm.eq.1) then
ygc=1.0d0-anpl**2/2.0d0
else
ygc=sqrt(1.0d0-anpl**2)
end if
c
nharm=int(ygc/yg-eps)+1
c
if(nharm.eq.0) return
c
nhf=0
do nn=nharm,nharm+4
ygn=nn*yg
if(iwarm.eq.1) then
rdu2=2.0d0*(ygn-ygc)
u1=anpl+sqrt(rdu2)
u2=anpl-sqrt(rdu2)
uu2=min(u1*u1,u2*u2)
argex=amu*uu2/2.0d0
else
rdu2=ygn**2-ygc**2
g1=(ygn+anpl*sqrt(rdu2))/dnl
g2=(ygn-anpl*sqrt(rdu2))/dnl
gg=min(g1,g2)
argex=amu*(gg-1.0d0)
u1=(ygn*anpl+sqrt(rdu2))/dnl
u2=(ygn*anpl-sqrt(rdu2))/dnl
end if
if(argex.le.xxcr) nhf=nn
end do
if(nhf.eq.0) return
c
lrm=ilarm
if(lrm.lt.nhf) lrm=nhf
call dispersion(lrm)
c
akim=ak0*anprim
ratiovgr=2.0d0*anpr/derdnm
c ratiovgr=2.0d0*anpr/derdnm*vgm
alpha=2.0d0*akim*ratiovgr
if(alpha.lt.0.0d0) then
ierr=94
print*,' IERR = ', ierr,' alpha negative'
end if
c
ithn=1
if(lrm.gt.nharm) ithn=2
if(ieccd.gt.0) call eccd(effjcd)
return
999 format(12(1x,e12.5))
end
c
c
c
subroutine dispersion(lrm)
implicit real*8(a-h,o-z)
parameter(imx=20)
complex*16 cc0,cc2,cc4,rr
complex*16 anpr2a,anpra
complex*16 anpr,anpr2,ex,ey,ez,den
complex*16 epsl(3,3,lrm),sepsl(3,3),e330
complex*16 e11,e22,e12,e13,e23
c complex*16 e33,e21,e31,e32
complex*16 a13,a31,a23,a32,a33
c
common/ygyg/yg
common/nplr/anpl,anprf
c
common/mode/sox
common/warm/iwarm,ilarm
c
common/nprw/anprr,anpri
common/epolar/ex,ey,ez
common/amut/amu
c
errnpr=1.0d0
anpr2a=anprf**2
anpl2=anpl*anpl
c
if (iwarm.eq.1) then
call diel_tens_wr(e330,epsl,lrm)
else
call diel_tens_fr(e330,epsl,lrm)
end if
c
do i=1,imx
c
do j=1,3
do k=1,3
sepsl(k,j)=dcmplx(0.0d0,0.0d0)
do ilrm=1,lrm
sepsl(k,j)=sepsl(k,j)+epsl(k,j,ilrm)*anpr2a**(ilrm-1)
end do
end do
end do
c
anpra=sqrt(anpr2a)
c
e11=sepsl(1,1)
e22=sepsl(2,2)
e12=sepsl(1,2)
a33=sepsl(3,3)
a13=sepsl(1,3)
a23=sepsl(2,3)
a31=a13
a32=-a23
c e33=e330+anpr2a*a33
e13=anpra*a13
e23=anpra*a23
c e21=-e12
c e31=e13
c e32=-e23
c
if(i.gt.2.and.errnpr.lt.1.0d-3) go to 999
c
cc4=(e11-anpl2)*(1.0d0-a33)+(a13+anpl)*(a31+anpl)
cc2=-e12*e12*(1.0d0-a33)
. -a32*e12*(a13+anpl)+a23*e12*(a31+anpl)
. -(a23*a32+e330+(e22-anpl2)*(1.0d0-a33))*(e11-anpl2)
. -(a13+anpl)*(a31+anpl)*(e22-anpl2)
cc0=e330*((e11-anpl2)*(e22-anpl2)+e12*e12)
c
rr=cc2*cc2-4.0d0*cc0*cc4
c
if(yg.gt.1.0d0) then
s=sox
if(dimag(rr).LE.0.0d0) s=-s
else
s=-sox
if(dble(rr).le.0.d0.and.dimag(rr).ge.0.d0) s=-s
end if
c
anpr2=(-cc2+s*sqrt(rr))/(2.0d0*cc4)
c
if(dble(anpr2).lt.0.0d0.and.dimag(anpr2).lt.0.0d0) then
anpr2=0.0d0
print*,' Y =',yg,' nperp2 < 0'
c ierr=99
go to 999
end if
c
errnpr=abs(1.0d0-abs(anpr2)/abs(anpr2a))
anpr2a=anpr2
end do
c
999 continue
if(i.gt.imx) print*,' i>imx ',yg,errnpr,i
c
anpr=sqrt(anpr2)
anprr=dble(anpr)
anpri=dimag(anpr)
99 format(20(1x,e12.5))
c
ex=dcmplx(0.0d0,0.0d0)
ey=dcmplx(0.0d0,0.0d0)
ez=dcmplx(0.0d0,0.0d0)
c
if (abs(anpl).gt.1.0d-6) then
den=e12*e23-(e13+anpr*anpl)*(e22-anpr2-anpl2)
ey=-(e12*(e13+anpr*anpl)+(e11-anpl2)*e23)/den
ez=(e12*e12+(e22-anpr2-anpl2)*(e11-anpl2))/den
ez2=abs(ez)**2
ey2=abs(ey)**2
enx2=1.0d0/(1.0d0+ey2+ez2)
ex=dcmplx(sqrt(enx2),0.0d0)
ez2=ez2*enx2
ey2=ey2*enx2
ez=ez*ex
ey=ey*ex
else
if(sox.lt.0.0d0) then
ez=dcmplx(1.0d0,0.0d0)
ez2=abs(ez)**2
else
ex2=1.0d0/(1.0d0+abs(-e11/e12)**2)
ex=sqrt(ex2)
ey=-ex*e11/e12
ey2=abs(ey)**2
ez2=0.0d0
end if
end if
c
return
end
c
c Fully relativistic case
c computation of dielectric tensor elements
c up to third order in Larmor radius for hermitian part
c
subroutine diel_tens_fr(e330,epsl,lrm)
implicit real*8(a-h,o-z)
complex*16 ui
complex*16 e330,epsl(3,3,lrm)
complex*16 ca11,ca12,ca22,ca13,ca23,ca33
complex*16 cq0p,cq0m,cq1p,cq1m,cq2p
parameter(pi=3.14159265358979d0,rpi=1.77245385090552d0)
parameter(ui=(0.0d0,1.0d0))
dimension rr(-lrm:lrm,0:2,0:lrm),ri(lrm,0:2,lrm)
c
common/xgxg/xg
common/ygyg/yg
common/amut/amu
common/nplr/anpl,anpr
common/resah/anpl2,dnl
c
common/cri/cr,ci
common/warm/iwarm,ilarm
c
anpl2=anpl**2
dnl=1.0d0-anpl2
c
cmxw=1.0d0+15.0d0/(8.0d0*amu)+105.0d0/(128.0d0*amu**2)
cr=-amu*amu/(rpi*cmxw)
ci=sqrt(2.0d0*pi*amu)*amu**2/cmxw
c
do l=1,lrm
do j=1,3
do i=1,3
epsl(i,j,l)=dcmplx(0.0d0,0.0d0)
end do
end do
end do
c
if(iwarm.eq.2) call hermitian(rr,lrm)
if(iwarm.eq.4) call hermitian_2(rr,lrm)
c
call antihermitian(ri,lrm)
c
do l=1,lrm
lm=l-1
fal=-0.25d0**l*fact(2*l)/(fact(l)**2*yg**(2*lm))
ca11=(0.0d0,0.0d0)
ca12=(0.0d0,0.0d0)
ca13=(0.0d0,0.0d0)
ca22=(0.0d0,0.0d0)
ca23=(0.0d0,0.0d0)
ca33=(0.0d0,0.0d0)
do is=0,l
k=l-is
w=(-1.0d0)**k
c
asl=w/(fact(is+l)*fact(l-is))
bsl=asl*(is*is+dble(2*k*lm*(l+is))/(2.0d0*l-1.0d0))
c
if(is.gt.0) then
cq0p=rr(is,0,l)+rr(-is,0,l)+ui*ri(is,0,l)
cq0m=rr(is,0,l)-rr(-is,0,l)+ui*ri(is,0,l)
cq1p=rr(is,1,l)+rr(-is,1,l)+ui*ri(is,1,l)
cq1m=rr(is,1,l)-rr(-is,1,l)+ui*ri(is,1,l)
cq2p=rr(is,2,l)+rr(-is,2,l)+ui*ri(is,2,l)
else
cq0p=rr(is,0,l)
cq0m=rr(is,0,l)
cq1p=rr(is,1,l)
cq1m=rr(is,1,l)
cq2p=rr(is,2,l)
end if
c
ca11=ca11+is**2*asl*cq0p
ca12=ca12+is*l*asl*cq0m
ca22=ca22+bsl*cq0p
ca13=ca13+is*asl*cq1m/yg
ca23=ca23+l*asl*cq1p/yg
ca33=ca33+asl*cq2p/yg**2
end do
epsl(1,1,l) = - xg*ca11*fal
epsl(1,2,l) = + ui*xg*ca12*fal
epsl(2,2,l) = - xg*ca22*fal
epsl(1,3,l) = - xg*ca13*fal
epsl(2,3,l) = - ui*xg*ca23*fal
epsl(3,3,l) = - xg*ca33*fal
end do
c
cq2p=rr(0,2,0)
e330=1.0d0+xg*cq2p
c
epsl(1,1,1) = 1.d0 + epsl(1,1,1)
epsl(2,2,1) = 1.d0 + epsl(2,2,1)
c
do l=1,lrm
epsl(2,1,l) = - epsl(1,2,l)
epsl(3,1,l) = epsl(1,3,l)
epsl(3,2,l) = - epsl(2,3,l)
end do
c
return
end
c
c
c
subroutine hermitian(rr,lrm)
implicit real*8(a-h,o-z)
parameter(tmax=5,npts=500)
dimension rr(-lrm:lrm,0:2,0:lrm)
real*8 ttv(npts+1),extv(npts+1)
c
common/ttex/ttv,extv
c
common/ygyg/yg
common/amut/amu
common/nplr/anpl,anpr
common/warm/iwarm,ilarm
common/cri/cr,ci
c
do n=-lrm,lrm
do k=0,2
do m=0,lrm
rr(n,k,m)=0.0d0
end do
end do
end do
c
llm=min(3,lrm)
c
dt=2.0d0*tmax/dble(npts)
bth2=2.0d0/amu
bth=sqrt(bth2)
amu2=amu*amu
amu4=amu2*amu2
amu6=amu4*amu2
c
do i = 1, npts+1
t = ttv(i)
rxt=sqrt(1.0d0+t*t/(2.0d0*amu))
x = t*rxt
upl2=bth2*x**2
upl=bth*x
gx=1.0d0+t*t/amu
exdx=cr*extv(i)*gx/rxt*dt
c
n1=1
if(iwarm.gt.2) n1=-llm
c
do n=n1,llm
nn=abs(n)
gr=anpl*upl+n*yg
zm=-amu*(gx-gr)
s=amu*(gx+gr)
zm2=zm*zm
zm3=zm2*zm
call calcei3(zm,fe0m)
c
do m=nn,llm
if(n.eq.0.and.m.eq.0) then
rr(0,2,0) = rr(0,2,0) - exdx*fe0m*upl2
else
ffe=0.0d0
if(m.eq.1) ffe=(1.0d0+s*(1.0d0-zm*fe0m))/amu2
if(m.eq.2) ffe=(6.0d0-2.0d0*zm+4.0d0*s
. +s*s*(1.0d0+zm-zm2*fe0m))/amu4
if(m.eq.3) ffe=(18.0d0*s*(s+4.0d0-zm)+6.0d0*
. (20.0d0-8.0d0*zm+zm2)+s**3*(2.0d0+zm+zm2-zm3*fe0m))/amu6
c
rr(n,0,m) = rr(n,0,m) + exdx*ffe
rr(n,1,m) = rr(n,1,m) + exdx*ffe*upl
rr(n,2,m) = rr(n,2,m) + exdx*ffe*upl2
end if
c
end do
end do
end do
c
if(iwarm.gt.2) return
c
sy1=1.0d0+yg
sy2=1.0d0+yg*2.0d0
sy3=1.0d0+yg*3.0d0
c
bth4=bth2*bth2
bth6=bth4*bth2
c
anpl2=anpl*anpl
c
rr(0,2,0) = -(1.0d0+bth2*(-1.25d0+1.5d0*anpl2)
. +bth4*(1.71875d0-6.0d0*anpl2+3.75d0*anpl2*anpl2))
rr(0,1,1) = -anpl*bth2*(1.0d0+bth2*(-2.25d0+1.5d0*anpl2))
rr(0,2,1) = -bth2*(1.0d0+bth2*(-0.5d0+1.5d0*anpl2))
rr(-1,0,1) = -2.0d0/sy1*(1.0d0+bth2/sy1*(-1.25d0+0.5d0*anpl2
. /sy1)+bth4/sy1*(-0.46875d0+(2.1875d0+0.625d0*anpl2)/
. sy1-2.625d0*anpl2/sy1**2+0.75d0*anpl2*anpl2/sy1**3))
rr(-1,1,1) = -anpl*bth2/sy1**2*(1.0d0+bth2*(1.25d0-3.5d0/sy1+
. 1.5d0*anpl2/sy1**2))
rr(-1,2,1) = -bth2/sy1*(1.0d0+bth2*(1.25d0-1.75d0/sy1+1.5d0*
. anpl2/sy1**2))
c
if(llm.gt.1) then
c
rr(0,0,2) = -4.0d0*bth2*(1.0d0+bth2*(-0.5d0+0.5d0*anpl2)+
. bth4*(1.125d0-1.875d0*anpl2+0.75d0*anpl2*anpl2))
rr(0,1,2) = -2.0d0*anpl*bth4*(1.0d0+bth2*(-1.5d0+1.5d0*anpl2))
rr(0,2,2) = -2.0d0*bth4*(1.0d0+bth2*(0.75d0+1.5d0*anpl2))
rr(-1,0,2) = -4.0d0*bth2/sy1*(1.0d0+bth2*
. (1.25d0-1.75d0/sy1+0.5d0*anpl2/sy1**2)+bth4*
. (0.46875d0-3.28125d0/sy1+(3.9375d0+1.5d0*anpl2)/sy1**2
. -3.375d0*anpl2/sy1**3+0.75d0*anpl2*anpl2/sy1**4))
rr(-1,1,2) = -2.0d0*bth4*anpl/sy1**2*(1.0d0+bth2*
. (3.0d0-4.5d0/sy1+1.5d0*anpl2/sy1**2))
rr(-1,2,2) = -2.0d0*bth4/sy1*(1.0d0+bth2*
. (3.0d0-2.25d0/sy1+1.5d0*anpl2/sy1**2))
rr(-2,0,2) = -4.0d0*bth2/sy2*(1.0d0+bth2*
. (1.25d0-1.75d0/sy2+0.5d0*anpl2/sy2**2)+bth4*
. (0.46875d0-3.28125d0/sy2+(3.9375d0+1.5d0*anpl2)/sy2**2
. -3.375d0*anpl2/sy2**3+0.75d0*anpl2*anpl2/sy2**4))
rr(-2,1,2) =-2.0d0*bth4*anpl/sy2**2*(1.0d0+bth2*
. (3.0d0-4.5d0/sy2+1.5d0*anpl2/sy2**2))
rr(-2,2,2) = -2.0d0*bth4/sy2*(1.0d0+bth2*
. (3.0d0-2.25d0/sy2+1.5d0*anpl2/sy2**2))
c
if(llm.gt.2) then
c
rr(0,0,3) = -12.0d0*bth4*(1+bth2*(0.75d0+0.5d0*anpl2)+bth4*
. (1.21875d0-1.5d0*anpl2+0.75d0*anpl2*anpl2))
rr(0,1,3) = -6.0d0*anpl*bth6*(1+bth2*(-0.25d0+1.5d0*anpl2))
rr(0,2,3) = -6.0d0*bth6*(1+bth2*(2.5d0+1.5d0*anpl2))
rr(-1,0,3) = -12.0d0*bth4/sy1*
. (1.0d0+bth2*(3.0d0-2.25d0/sy1+0.5d0*anpl2/sy1**2)+
. bth4*(3.75d0-8.71875d0/sy1+(6.1875d0+2.625d0*anpl2)
. /sy1**2-4.125d0*anpl2/sy1**3+0.75d0*anpl2*anpl2/sy1**4))
rr(-1,1,3) = -6.0d0*anpl*bth6/sy1**2*
. (1.0d0+bth2*(5.25d0-5.5d0/sy1+1.5d0*anpl2/sy1**2))
rr(-1,2,3) = -6.0d0*bth6/sy1*
. (1.0d0+bth2*(5.25d0-2.75d0/sy1+1.5d0*anpl2/sy1**2))
c
rr(-2,0,3) = -12.0d0*bth4/sy2*
. (1.0d0+bth2*(3.0d0-2.25d0/sy2+0.5d0*anpl2/sy2**2)+
. bth4*(3.75d0-8.71875d0/sy2+(6.1875d0+2.625d0*anpl2)
. /sy2**2-4.125d0*anpl2/sy2**3+0.75d0*anpl2*anpl2/sy2**4))
rr(-2,1,3) = -6.0d0*anpl*bth6/sy2**2*
. (1.0d0+bth2*(5.25d0-5.5d0/sy2+1.5d0*anpl2/sy2**2))
rr(-2,2,3) = -6.0d0*bth6/sy2*
. (1.0d0+bth2*(5.25d0-2.75d0/sy2+1.5d0*anpl2/sy2**2))
c
rr(-3,0,3) = -12.0d0*bth4/sy3*
. (1.0d0+bth2*(3.0d0-2.25d0/sy3+0.5d0*anpl2/sy3**2)+
. bth4*(3.75d0-8.71875d0/sy3+(6.1875d0+2.625d0*anpl2)
. /sy3**2-4.125d0*anpl2/sy3**3+0.75d0*anpl2*anpl2/sy3**4))
rr(-3,1,3) = -6.0d0*anpl*bth6/sy3**2*
. (1.0d0+bth2*(5.25d0-5.5d0/sy3+1.5d0*anpl2/sy3**2))
rr(-3,2,3) = -6.0d0*bth6/sy3*
. (1.0d0+bth2*(5.25d0-2.75d0/sy3+1.5d0*anpl2/sy3**2))
c
end if
end if
c
return
end
subroutine hermitian_2(rr,lrm)
implicit real*8(a-h,o-z)
parameter(tmax=5,npts=500)
dimension rr(-lrm:lrm,0:2,0:lrm)
parameter(epsa=0.0d0,epsr=1.0d-4)
parameter (lw=5000,liw=lw/4)
dimension w(lw),iw(liw)
external fhermit
c
common/ygyg/yg
common/amut/amu
common/nplr/anpl,anpr
common/warm/iwarm,ilarm
common/cri/cr,ci
common/nmhermit/n,m,ih
c
do n=-lrm,lrm
do k=0,2
do m=0,lrm
rr(n,k,m)=0.0d0
end do
end do
end do
c
llm=min(3,lrm)
c
bth2=2.0d0/amu
bth=sqrt(bth2)
amu2=amu*amu
amu4=amu2*amu2
amu6=amu4*amu2
c
n1=1
if(iwarm.gt.10) n1=-llm
c
do n=n1,llm
nn=abs(n)
do m=nn,llm
if(n.eq.0.and.m.eq.0) then
ih=2
c call dqagi(fhermit,bound,2,epsa,epsr,resfh,
call dqags(fhermit,-tmax,tmax,epsa,epsr,resfh,
. epp,neval,ier,liw,lw,last,iw,w)
rr(n,2,m) = resfh
else
do ih=0,2
c call dqagi(fhermit,bound,2,epsa,epsr,resfh,
call dqags(fhermit,-tmax,tmax,epsa,epsr,resfh,
. epp,neval,ier,liw,lw,last,iw,w)
rr(n,ih,m) = resfh
end do
end if
end do
end do
c write(83,'(12(1x,e12.5))')
c . yg,rr(1,0,1),rr(1,1,1),rr(1,2,1)
if(iwarm.gt.10) return
c
sy1=1.0d0+yg
sy2=1.0d0+yg*2.0d0
sy3=1.0d0+yg*3.0d0
c
bth4=bth2*bth2
bth6=bth4*bth2
c
anpl2=anpl*anpl
c
rr(0,2,0) = -(1.0d0+bth2*(-1.25d0+1.5d0*anpl2)
. +bth4*(1.71875d0-6.0d0*anpl2+3.75d0*anpl2*anpl2))
rr(0,1,1) = -anpl*bth2*(1.0d0+bth2*(-2.25d0+1.5d0*anpl2))
rr(0,2,1) = -bth2*(1.0d0+bth2*(-0.5d0+1.5d0*anpl2))
rr(-1,0,1) = -2.0d0/sy1*(1.0d0+bth2/sy1*(-1.25d0+0.5d0*anpl2
. /sy1)+bth4/sy1*(-0.46875d0+(2.1875d0+0.625d0*anpl2)/
. sy1-2.625d0*anpl2/sy1**2+0.75d0*anpl2*anpl2/sy1**3))
rr(-1,1,1) = -anpl*bth2/sy1**2*(1.0d0+bth2*(1.25d0-3.5d0/sy1+
. 1.5d0*anpl2/sy1**2))
rr(-1,2,1) = -bth2/sy1*(1.0d0+bth2*(1.25d0-1.75d0/sy1+1.5d0*
. anpl2/sy1**2))
c
if(llm.gt.1) then
c
rr(0,0,2) = -4.0d0*bth2*(1.0d0+bth2*(-0.5d0+0.5d0*anpl2)+
. bth4*(1.125d0-1.875d0*anpl2+0.75d0*anpl2*anpl2))
rr(0,1,2) = -2.0d0*anpl*bth4*(1.0d0+bth2*(-1.5d0+1.5d0*anpl2))
rr(0,2,2) = -2.0d0*bth4*(1.0d0+bth2*(0.75d0+1.5d0*anpl2))
rr(-1,0,2) = -4.0d0*bth2/sy1*(1.0d0+bth2*
. (1.25d0-1.75d0/sy1+0.5d0*anpl2/sy1**2)+bth4*
. (0.46875d0-3.28125d0/sy1+(3.9375d0+1.5d0*anpl2)/sy1**2
. -3.375d0*anpl2/sy1**3+0.75d0*anpl2*anpl2/sy1**4))
rr(-1,1,2) = -2.0d0*bth4*anpl/sy1**2*(1.0d0+bth2*
. (3.0d0-4.5d0/sy1+1.5d0*anpl2/sy1**2))
rr(-1,2,2) = -2.0d0*bth4/sy1*(1.0d0+bth2*
. (3.0d0-2.25d0/sy1+1.5d0*anpl2/sy1**2))
rr(-2,0,2) = -4.0d0*bth2/sy2*(1.0d0+bth2*
. (1.25d0-1.75d0/sy2+0.5d0*anpl2/sy2**2)+bth4*
. (0.46875d0-3.28125d0/sy2+(3.9375d0+1.5d0*anpl2)/sy2**2
. -3.375d0*anpl2/sy2**3+0.75d0*anpl2*anpl2/sy2**4))
rr(-2,1,2) =-2.0d0*bth4*anpl/sy2**2*(1.0d0+bth2*
. (3.0d0-4.5d0/sy2+1.5d0*anpl2/sy2**2))
rr(-2,2,2) = -2.0d0*bth4/sy2*(1.0d0+bth2*
. (3.0d0-2.25d0/sy2+1.5d0*anpl2/sy2**2))
c
if(llm.gt.2) then
c
rr(0,0,3) = -12.0d0*bth4*(1+bth2*(0.75d0+0.5d0*anpl2)+bth4*
. (1.21875d0-1.5d0*anpl2+0.75d0*anpl2*anpl2))
rr(0,1,3) = -6.0d0*anpl*bth6*(1+bth2*(-0.25d0+1.5d0*anpl2))
rr(0,2,3) = -6.0d0*bth6*(1+bth2*(2.5d0+1.5d0*anpl2))
rr(-1,0,3) = -12.0d0*bth4/sy1*
. (1.0d0+bth2*(3.0d0-2.25d0/sy1+0.5d0*anpl2/sy1**2)+
. bth4*(3.75d0-8.71875d0/sy1+(6.1875d0+2.625d0*anpl2)
. /sy1**2-4.125d0*anpl2/sy1**3+0.75d0*anpl2*anpl2/sy1**4))
rr(-1,1,3) = -6.0d0*anpl*bth6/sy1**2*
. (1.0d0+bth2*(5.25d0-5.5d0/sy1+1.5d0*anpl2/sy1**2))
rr(-1,2,3) = -6.0d0*bth6/sy1*
. (1.0d0+bth2*(5.25d0-2.75d0/sy1+1.5d0*anpl2/sy1**2))
c
rr(-2,0,3) = -12.0d0*bth4/sy2*
. (1.0d0+bth2*(3.0d0-2.25d0/sy2+0.5d0*anpl2/sy2**2)+
. bth4*(3.75d0-8.71875d0/sy2+(6.1875d0+2.625d0*anpl2)
. /sy2**2-4.125d0*anpl2/sy2**3+0.75d0*anpl2*anpl2/sy2**4))
rr(-2,1,3) = -6.0d0*anpl*bth6/sy2**2*
. (1.0d0+bth2*(5.25d0-5.5d0/sy2+1.5d0*anpl2/sy2**2))
rr(-2,2,3) = -6.0d0*bth6/sy2*
. (1.0d0+bth2*(5.25d0-2.75d0/sy2+1.5d0*anpl2/sy2**2))
c
rr(-3,0,3) = -12.0d0*bth4/sy3*
. (1.0d0+bth2*(3.0d0-2.25d0/sy3+0.5d0*anpl2/sy3**2)+
. bth4*(3.75d0-8.71875d0/sy3+(6.1875d0+2.625d0*anpl2)
. /sy3**2-4.125d0*anpl2/sy3**3+0.75d0*anpl2*anpl2/sy3**4))
rr(-3,1,3) = -6.0d0*anpl*bth6/sy3**2*
. (1.0d0+bth2*(5.25d0-5.5d0/sy3+1.5d0*anpl2/sy3**2))
rr(-3,2,3) = -6.0d0*bth6/sy3*
. (1.0d0+bth2*(5.25d0-2.75d0/sy3+1.5d0*anpl2/sy3**2))
c
end if
end if
c
return
end
function fhermit(t)
implicit real*8 (a-h,o-z)
c
common/ygyg/yg
common/amut/amu
common/nplr/anpl,anpr
common/cri/cr,ci
common/nmhermit/n,m,ih
bth2=2.0d0/amu
bth=sqrt(bth2)
amu2=amu*amu
amu4=amu2*amu2
amu6=amu4*amu2
rxt=sqrt(1.0d0+t*t/(2.0d0*amu))
x = t*rxt
upl2=bth2*x**2
upl=bth*x
gx=1.0d0+t*t/amu
exdxdt=cr*exp(-t*t)*gx/rxt
nn=abs(n)
gr=anpl*upl+n*yg
zm=-amu*(gx-gr)
s=amu*(gx+gr)
zm2=zm*zm
zm3=zm2*zm
call calcei3(zm,fe0m)
ffe=0.0d0
uplh=upl**ih
if(n.eq.0.and.m.eq.0) ffe=exdxdt*fe0m*upl2
if(m.eq.1) ffe=(1.0d0+s*(1.0d0-zm*fe0m))*uplh/amu2
if(m.eq.2) ffe=(6.0d0-2.0d0*zm+4.0d0*s
. +s*s*(1.0d0+zm-zm2*fe0m))*uplh/amu4
if(m.eq.3) ffe=(18.0d0*s*(s+4.0d0-zm)+6.0d0*(20.0d0-8.0d0*zm+zm2)
. +s**3*(2.0d0+zm+zm2-zm3*fe0m))*uplh/amu6
fhermit= exdxdt*ffe
return
end
c
c
c
subroutine antihermitian(ri,lrm)
implicit none
integer lmx,nmx,lrm,n,k,m,mm
real*8 rpi
parameter(rpi=1.77245385090552d0)
parameter(lmx=20,nmx=lmx+2)
real*8 fsbi(nmx)
real*8 ri(lrm,0:2,lrm)
real*8 yg,amu,anpl,cmu,anpl2,dnl,cr,ci,ygn,rdu2,rdu,anpr
real*8 du,ub,aa,up,um,gp,gm,xp,xm,eep,eem,ee,cm,cim
real*8 fi0p0,fi1p0,fi2p0,fi0m0,fi1m0,fi2m0
real*8 fi0p1,fi1p1,fi2p1,fi0m1,fi1m1,fi2m1,fi0m,fi1m,fi2m
real*8 fact
c
common/ygyg/yg
common/amut/amu
common/nplr/anpl,anpr
common/uu/ub,cmu
common/resah/anpl2,dnl
c
common/cri/cr,ci
c
do n=1,lrm
do k=0,2
do m=1,lrm
ri(n,k,m)=0.0d0
end do
end do
end do
c
dnl=1.0d0-anpl2
cmu=anpl*amu
c
do n=1,lrm
ygn=n*yg
rdu2=ygn**2-dnl
if(rdu2.gt.0.0d0) then
rdu=sqrt(rdu2)
du=rdu/dnl
ub=anpl*ygn/dnl
aa=amu*anpl*du
if (abs(aa).gt.5.0d0) then
up=ub+du
um=ub-du
gp=anpl*up+ygn
gm=anpl*um+ygn
xp=up+1.0d0/cmu
xm=um+1.0d0/cmu
eem=exp(-amu*(gm-1.0d0))
eep=exp(-amu*(gp-1.0d0))
fi0p0=-1.0d0/cmu
fi1p0=-xp/cmu
fi2p0=-(1.0d0/cmu**2+xp*xp)/cmu
fi0m0=-1.0d0/cmu
fi1m0=-xm/cmu
fi2m0=-(1.0d0/cmu**2+xm*xm)/cmu
do m=1,lrm
fi0p1=-2.0d0*m*(fi1p0-ub*fi0p0)/cmu
fi0m1=-2.0d0*m*(fi1m0-ub*fi0m0)/cmu
fi1p1=-((1.0d0+2.0d0*m)*fi2p0-2.0d0*(m+1.0d0)*ub*fi1p0
. +up*um*fi0p0)/cmu
fi1m1=-((1.0d0+2.0d0*m)*fi2m0-2.0d0*(m+1.0d0)*ub*fi1m0
. +up*um*fi0m0)/cmu
fi2p1=(2.0d0*(1.0d0+m)*fi1p1-2.0d0*m*
. (ub*fi2p0-up*um*fi1p0))/cmu
fi2m1=(2.0d0*(1.0d0+m)*fi1m1-2.0d0*m*
. (ub*fi2m0-up*um*fi1m0))/cmu
if(m.ge.n) then
ri(n,0,m)=0.5d0*ci*dnl**m*(fi0p1*eep-fi0m1*eem)
ri(n,1,m)=0.5d0*ci*dnl**m*(fi1p1*eep-fi1m1*eem)
ri(n,2,m)=0.5d0*ci*dnl**m*(fi2p1*eep-fi2m1*eem)
end if
fi0p0=fi0p1
fi1p0=fi1p1
fi2p0=fi2p1
fi0m0=fi0m1
fi1m0=fi1m1
fi2m0=fi2m1
end do
else
ee=exp(-amu*(ygn-1.0d0+anpl*ub))
call ssbi(aa,n,lrm,fsbi)
do m=n,lrm
cm=rpi*fact(m)*du**(2*m+1)
cim=0.5d0*ci*dnl**m
mm=m-n+1
fi0m=cm*fsbi(mm)
fi1m=-0.5d0*aa*cm*fsbi(mm+1)
fi2m=0.5d0*cm*(fsbi(mm+1)+0.5d0*aa*aa*fsbi(mm+2))
ri(n,0,m)=cim*ee*fi0m
ri(n,1,m)=cim*ee*(du*fi1m+ub*fi0m)
ri(n,2,m)=cim*ee*(du*du*fi2m+2.0d0*du*ub*fi1m+ub*ub*fi0m)
end do
end if
end if
end do
c
return
end
c
subroutine ssbi(zz,n,l,fsbi)
implicit none
integer n,l,nmx,lmx,k,m,mm
real*8 eps,c0,c1,sbi,zz
real*8 gamm
parameter(eps=1.0d-10,lmx=20,nmx=lmx+2)
real*8 fsbi(nmx)
do m=n,l+2
c0=1.0d0/gamm(dble(m)+1.5d0)
sbi=c0
do k=1,50
c1=c0*0.25d0*zz**2/(dble(m+k)+0.5d0)/dble(k)
sbi=sbi+c1
if(c1/sbi.lt.eps) exit
c0=c1
end do
mm=m-n+1
fsbi(mm)=sbi
end do
return
end
c
c Weakly relativistic dielectric tensor
c computation of dielectric tensor elements
c Krivenki and Orefice, JPP 30,125 (1983)
c
subroutine diel_tens_wr(ce330,cepsl,lrm)
implicit real*8 (a-b,d-h,o-z)
implicit complex*16 (c)
dimension cefp(0:lrm,0:2),cefm(0:lrm,0:2),cepsl(3,3,lrm)
parameter(cui=(0.0d0,1.0d0))
c
common/xgxg/xg
common/ygyg/yg
common/nplr/anpl,anprf
common/amut/amu
c
anpl2=anpl*anpl
c
call fsup(cefp,cefm,lrm)
c
do l=1,lrm
lm=l-1
fcl=0.5d0**l*((1.0d0/yg)**2/amu)**lm*fact(2*l)/fact(l)
ca11=(0.d0,0.d0)
ca12=(0.d0,0.d0)
ca13=(0.d0,0.d0)
ca22=(0.d0,0.d0)
ca23=(0.d0,0.d0)
ca33=(0.d0,0.d0)
do is=0,l
k=l-is
w=(-1.0d0)**k
c
asl=w/(fact(is+l)*fact(l-is))
bsl=asl*(is*is+dble(2*k*lm*(l+is))/(2.0d0*l-1.0d0))
c
cq0p=amu*cefp(is,0)
cq0m=amu*cefm(is,0)
cq1p=amu*anpl*(cefp(is,0)-cefp(is,1))
cq1m=amu*anpl*(cefm(is,0)-cefm(is,1))
cq2p=cefp(is,1)+amu*anpl2*(cefp(is,2)
. +cefp(is,0)-2.0d0*cefp(is,1))
c
ca11=ca11+is**2*asl*cq0p
ca12=ca12+is*l*asl*cq0m
ca22=ca22+bsl*cq0p
ca13=ca13+is*asl*cq1m/yg
ca23=ca23+l*asl*cq1p/yg
ca33=ca33+asl*cq2p/yg**2
end do
cepsl(1,1,l) = - xg*ca11*fcl
cepsl(1,2,l) = + cui*xg*ca12*fcl
cepsl(2,2,l) = - xg*ca22*fcl
cepsl(1,3,l) = - xg*ca13*fcl
cepsl(2,3,l) = - cui*xg*ca23*fcl
cepsl(3,3,l) = - xg*ca33*fcl
end do
c
cq2p=cefp(0,1)+amu*anpl2*(cefp(0,2)+cefp(0,0)-2.0d0*cefp(0,1))
ce330=1.0d0-xg*amu*cq2p
c
cepsl(1,1,1) = 1.d0 + cepsl(1,1,1)
cepsl(2,2,1) = 1.d0 + cepsl(2,2,1)
c
do l=1,lrm
cepsl(2,1,l) = - cepsl(1,2,l)
cepsl(3,1,l) = cepsl(1,3,l)
cepsl(3,2,l) = - cepsl(2,3,l)
end do
c
return
end
c
c
c
subroutine fsup(cefp,cefm,lrm)
implicit real*8 (a-b,d-h,o-z)
implicit complex*16 (c)
parameter(apsicr=0.7d0)
parameter(cui=(0.0d0,1.0d0))
dimension cefp(0:lrm,0:2),cefm(0:lrm,0:2)
c
common/ygyg/yg
common/nplr/anpl,anprf
common/amut/amu
c
psi=sqrt(0.5d0*amu)*anpl
apsi=abs(psi)
c
do is=0,lrm
alpha=anpl*anpl/2.0d0+is*yg-1.0d0
phi2=amu*alpha
phim=sqrt(abs(phi2))
if (alpha.ge.0) then
xp=psi-phim
yp=0.0d0
xm=-psi-phim
ym=0.0d0
x0=-phim
y0=0.0d0
else
xp=psi
yp=phim
xm=-psi
ym=phim
x0=0.0d0
y0=phim
end if
call zetac (xp,yp,zrp,zip,iflag)
call zetac (xm,ym,zrm,zim,iflag)
c
czp=dcmplx(zrp,zip)
czm=dcmplx(zrm,zim)
cf12=(0.0d0,0.0d0)
if (alpha.ge.0) then
if (alpha.ne.0) cf12=-(czp+czm)/(2.0d0*phim)
else
cf12=-cui*(czp+czm)/(2.0d0*phim)
end if
c
if(apsi.gt.apsicr) then
cf32=-(czp-czm)/(2.0d0*psi)
else
cphi=phim
if(alpha.lt.0) cphi=-cui*phim
call zetac (x0,y0,zr0,zi0,iflag)
cz0=dcmplx(zr0,zi0)
cdz0=2.0d0*(1.0d0-cphi*cz0)
cf32=cdz0
end if
c
cf0=cf12
cf1=cf32
cefp(is,0)=cf32
cefm(is,0)=cf32
do l=1,is+2
iq=l-1
if(apsi.gt.apsicr) then
cf2=(1.0d0+phi2*cf0-(iq+0.5d0)*cf1)/psi**2
else
cf2=(1.0d0+phi2*cf1)/dble(iq+1.5d0)
end if
ir=l-is
if(ir.ge.0) then
cefp(is,ir)=cf2
cefm(is,ir)=cf2
end if
cf0=cf1
cf1=cf2
end do
c
if(is.ne.0) then
c
alpha=anpl*anpl/2.0d0-is*yg-1.0d0
phi2=amu*alpha
phim=sqrt(abs(phi2))
if (alpha.ge.0.0d0) then
xp=psi-phim
yp=0.0d0
xm=-psi-phim
ym=0.0d0
x0=-phim
y0=0.0d0
else
xp=psi
yp=phim
xm=-psi
ym=phim
x0=0.0d0
y0=phim
end if
call zetac (xp,yp,zrp,zip,iflag)
call zetac (xm,ym,zrm,zim,iflag)
c
czp=dcmplx(zrp,zip)
czm=dcmplx(zrm,zim)
c
cf12=(0.0d0,0.0d0)
if (alpha.ge.0) then
if (alpha.ne.0.0d0) cf12=-(czp+czm)/(2.0d0*phim)
else
cf12=-cui*(czp+czm)/(2.0d0*phim)
end if
if(apsi.gt.apsicr) then
cf32=-(czp-czm)/(2.0d0*psi)
else
cphi=phim
if(alpha.lt.0) cphi=-cui*phim
call zetac (x0,y0,zr0,zi0,iflag)
cz0=dcmplx(zr0,zi0)
cdz0=2.0d0*(1.0d0-cphi*cz0)
cf32=cdz0
end if
c
cf0=cf12
cf1=cf32
do l=1,is+2
iq=l-1
if(apsi.gt.apsicr) then
cf2=(1.0d0+phi2*cf0-(iq+0.5d0)*cf1)/psi**2
else
cf2=(1.0d0+phi2*cf1)/dble(iq+1.5d0)
end if
ir=l-is
if(ir.ge.0) then
cefp(is,ir)=cefp(is,ir)+cf2
cefm(is,ir)=cefm(is,ir)-cf2
end if
cf0=cf1
cf1=cf2
end do
c
end if
c
end do
c
return
end
subroutine eccd(effjcd)
use green_func_p
implicit none
real*8 anum,denom,resp,resj,effjcd,coullog,dens,tekev
real*8 anucc,canucc,ddens
real*8 qesi,mesi,vcsi,qe,me,vc,ceff,Zeff
real*8 rbn,rbx,btot,bmin,bmax,alams,fp0s,pa,fc
real*8 fjch,fjncl,fjch0,fconic
real*8 cst,cst2
integer ieccd,nharm,nhf,nhn
external fjch,fjncl,fjch0
parameter(qesi=1.602176487d-19,mesi=9.10938215d-31)
parameter(vcsi=2.99792458d+8)
parameter(qe=4.8032068d-10,me=mesi*1.d3,vc=vcsi*1.d2)
parameter(canucc=4.0d13*pi*qe**4/(me**2*vc**3))
parameter(ceff=qesi/(mesi*vcsi))
common/nharm/nharm,nhf
common/nhn/nhn
common/ieccd/ieccd
common/tete/tekev
common/dens/dens,ddens
common/zz/Zeff
common/btot/btot
common/bmxmn/bmax,bmin
common/fc/fc
common/ncl/rbx
common/cohen/rbn,alams,pa,fp0s
common/cst/cst,cst2
anum=0.0d0
denom=0.0d0
effjcd=0.0d0
coullog=24.0d0-log(1.0d4*sqrt(0.1d0*dens)/tekev)
anucc=canucc*dens*coullog
c nhf=nharm
select case(ieccd)
case(1)
c cohen model
c rbn=B/B_min
c rbx=B/B_max
c cst2=1.0d0-B/B_max
c alams=sqrt(1-B_min/B_max)
c Zeff < 31 !!!
c fp0s= P_a (alams)
rbn=btot/bmin
rbx=btot/bmax
cst2=1.0d0-rbx
if(cst2.lt.1d-6) cst2=0.0d0
cst=sqrt(cst2)
alams=sqrt(1.0d0-bmin/bmax)
pa=sqrt(32.0d0/(Zeff+1.0d0)-1.0d0)/2.0d0
fp0s=fconic(alams,pa,0)
do nhn=nharm,nhf
call curr_int(fjch,resj,resp)
anum=anum+resj
denom=denom+resp
end do
case(2:9)
cst=0.0d0
cst2=0.0d0
do nhn=nharm,nhf
call curr_int(fjch0,resj,resp)
anum=anum+resj
denom=denom+resp
end do
case(10:11)
c neoclassical model:
c ft=1-fc trapped particle fraction
c rzfc=(1+Zeff)/fc
rbn=btot/bmin
rbx=btot/bmax
cst2=1.0d0-rbx
if(cst2.lt.1d-6) cst2=0.0d0
cst=sqrt(cst2)
call SpitzFuncCoeff(Tekev,Zeff,fc)
do nhn=nharm,nhf
call curr_int(fjncl,resj,resp)
anum=anum+resj
denom=denom+resp
end do
nhn=nhn-1
CASE DEFAULT
print*,'ieccd undefined'
end select
c
c effjpl = <J_parallel>/<p_d> /(B_min/<B>) [A m /W]
c
if(denom.gt.0.0d0) effjcd=-ceff*anum/(anucc*denom)
return
end
c
c
c
subroutine curr_int(fcur,resj,resp)
implicit real*8(a-h,o-z)
parameter(epsa=0.0d0,epsr=1.0d-2)
parameter(xxcr=16.0d0)
parameter (lw=5000,liw=lw/4)
dimension w(lw),iw(liw)
external fcur,fpp
common/nhn/nhn
common/ygyg/yg
common/nplr/anpl,anpr
common/amut/amu
common/gg/uplp,uplm,ygn
common/ierr/ierr
common/iokh/iokhawa
common/cst/cst,cst2
c EC power and current densities
anpl2=anpl*anpl
dnl=1.0d0-anpl2
ygn=nhn*yg
ygn2=ygn*ygn
resj=0.0d0
resj1=0.0d0
resj2=0.0d0
resp=0.0d0
c
rdu2=anpl2+ygn2-1.0d0
uplp=0.0d0
uplm=0.0d0
upltp=0.0d0
upltm=0.0d0
c
if (rdu2.ge.0.0d0) then
rdu=sqrt(rdu2)
uplp=(anpl*ygn+rdu)/dnl
uplm=(anpl*ygn-rdu)/dnl
c
uu1=uplm
uu2=uplp
xx1=amu*(anpl*uu1+ygn-1.0d0)
xx2=amu*(anpl*uu2+ygn-1.0d0)
c
if(xx2.gt.xxcr) uu2=(xxcr/amu-ygn+1.0d0)/anpl
if(xx1.gt.xxcr) uu1=(xxcr/amu-ygn+1.0d0)/anpl
duu=abs(uu1-uu2)
c
if(duu.gt.1.d-6) then
call dqags(fpp,uu1,uu2,epsa,epsr,resp,epp,neval,ier,
. liw,lw,last,iw,w)
if (ier.gt.0) ierr=90
end if
c
rdu2t=cst2*anpl2+ygn2-1.0d0
c
if (rdu2t.lt.0.0d0.or.cst2.eq.0.0d0) then
c
c resonance curve does not cross the trapping region
c
iokhawa=0
if(duu.gt.1.d-4) then
call dqags(fcur,uu1,uu2,epsa,epsr,
. resj,ej,neval,ier,liw,lw,last,iw,w)
if (ier.gt.0) ierr=91
end if
else
c
c resonance curve crosses the trapping region
c
iokhawa=1
rdut=sqrt(rdu2t)
upltm=(cst2*anpl*ygn-cst*rdut)/(1.0d0-cst2*anpl2)
upltp=(cst2*anpl*ygn+cst*rdut)/(1.0d0-cst2*anpl2)
c
uu1=uplm
uu2=upltm
xx1=amu*(anpl*uu1+ygn-1.0d0)
xx2=amu*(anpl*uu2+ygn-1.0d0)
if(xx1.lt.xxcr.or.xx2.lt.xxcr) then
if(xx2.gt.xxcr) uu2=(xxcr/amu-ygn+1.0d0)/anpl
if(xx1.gt.xxcr) uu1=(xxcr/amu-ygn+1.0d0)/anpl
duu=abs(uu1-uu2)
if(duu.gt.1.d-6) then
call dqags(fcur,uu1,uu2,epsa,epsr,
. resj1,ej1,neval,ier,liw,lw,last,iw,w)
if (ier.gt.0) then
if (abs(resj1).lt.1.0d-10) then
resj1=0.0d0
else
ierr=92
end if
end if
end if
end if
c
uu1=upltp
uu2=uplp
xx1=amu*(anpl*uu1+ygn-1.0d0)
xx2=amu*(anpl*uu2+ygn-1.0d0)
if(xx1.lt.xxcr.or.xx2.lt.xxcr) then
if(xx2.gt.xxcr) uu2=(xxcr/amu-ygn+1.0d0)/anpl
if(xx1.gt.xxcr) uu1=(xxcr/amu-ygn+1.0d0)/anpl
duu=abs(uu1-uu2)
if(duu.gt.1.d-6) then
call dqags(fcur,uu1,uu2,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
end if
end if
return
end
c
c computation of integral for power density, integrand function fpp
c
c ith=0 : polarization term = const
c ith=1 : polarization term Larmor radius expansion to lowest order
c ith=2 : full polarization term (J Bessel)
c
function fpp(upl)
implicit real*8 (a-h,o-z)
complex*16 ex,ey,ez,ui,emxy,epxy
parameter(ui=(0.0d0,1.0d0))
common/ygyg/yg
common/nplr/anpl,anpr
common/amut/amu
common/gg/uplp,uplm,ygn
common/epolar/ex,ey,ez
common/nprw/anprre,anprim
common/ithn/ithn
common/nhn/nhn
upr2=(1.0d0-anpl**2)*(uplp-upl)*(upl-uplm)
gam=anpl*upl+ygn
ee=exp(-amu*(gam-1))
thn2=1.0d0
thn2u=upr2*thn2
if(ithn.gt.0) then
emxy=ex-ui*ey
epxy=ex+ui*ey
if(upr2.gt.0.0d0) then
upr=sqrt(upr2)
bb=anprre*upr/yg
if(ithn.eq.1) then
c Larmor radius expansion polarization term at lowest order
cth=1.0d0
if(nhn.gt.1) cth=(0.5d0*bb)**(nhn-1)*nhn/fact(nhn)
thn2=(0.5d0*cth*abs(emxy+ez*anprre*upl/ygn))**2
thn2u=upr2*thn2
else
c Full polarization term
nm=nhn-1
np=nhn+1
ajbnm=dbesjn(nm, bb)
ajbnp=dbesjn(np, bb)
ajbn=dbesjn(nhn, bb)
thn2u=(abs(ez*ajbn*upl+upr*(ajbnp*epxy+ajbnm*emxy)/2.0d0))**2
end if
end if
end if
fpp=ee*thn2u
return
end
c computation of integral for current density
c fjch integrand for Cohen model with trapping
c fjch0 integrand for Cohen model without trapping
c fjncl integrand for momentum conserv. model K(u) from Maruschenko
c gg=F(u)/u with F(u) as in Cohen paper
function fjch(upl)
implicit real*8 (a-h,o-z)
common/gg/uplp,uplm,ygn
common/nplr/anpl,anpr
common/zz/Zeff
common/cohen/rb,alams,pa,fp0s
upr2=(1.0d0-anpl**2)*(uplp-upl)*(upl-uplm)
gam=anpl*upl+ygn
u2=gam*gam-1.0d0
u=sqrt(u2)
z5=Zeff+5.0d0
xi=1.0d0/z5**2
xib=1.0d0-xi
xibi=1.0d0/xib
fu2b=1.0d0+xib*u2
fu2=1.0d0+xi*u2
gu=(1.0d0-1.0d0/fu2b**xibi)/sqrt(fu2)
gg=u*gu/z5
dgg=(gu+u2*(2.0d0/fu2b**(1.0d0+xibi)/sqrt(fu2)-xi*gu/fu2))/z5
alam=sqrt(1.0d0-upr2/u2/rb)
fp0=fconic(alam,pa,0)
dfp0=-(pa*pa/2.0d0+0.125d0)
if (alam.lt.1.0d0) then
dfp0=-fconic(alam,pa,1)/sqrt(1.0d0-alam**2)
end if
fh=alam*(1.0d0-alams*fp0/(alam*fp0s))
dfhl=1.0d0-alams*dfp0/fp0s
eta=gam*fh*(gg/u+dgg)+upl*(anpl*u2-upl*gam)*gg*dfhl/(u2*u*rb*alam)
if(upl.lt.0.0d0) eta=-eta
fjch=eta*fpp(upl)
return
end
function fjch0(upl)
implicit real*8 (a-h,o-z)
common/gg/uplp,uplm,ygn
common/nplr/anpl,anpr
common/zz/Zeff
gam=anpl*upl+ygn
u2=gam*gam-1.0d0
u=sqrt(u2)
z5=Zeff+5.0d0
xi=1.0d0/z5**2
xib=1.0d0-xi
xibi=1.0d0/xib
fu2b=1.0d0+xib*u2
fu2=1.0d0+xi*u2
gu=(1.0d0-1.0d0/fu2b**xibi)/sqrt(fu2)
gg=u*gu/z5
dgg=(gu+u2*(2.0d0/fu2b**(1.0d0+xibi)/sqrt(fu2)-xi*gu/fu2))/z5
eta=anpl*gg+gam*upl*dgg/u
fjch0=eta*fpp(upl)
return
end
function fjncl(upl)
use green_func_p
implicit real*8 (a-h,o-z)
common/gg/uplp,uplm,ygn
common/nplr/anpl,anpr
common/fc/fc
common/ncl/hb
common/psival/psinv
common/amut/amu
common/tete/tekev
common/zz/Zeff
gam=anpl*upl+ygn
u2=gam*gam-1.0d0
u=sqrt(u2)
upr2=u2-upl*upl
bth=sqrt(2.0d0/amu)
uth=u/bth
call GenSpitzFunc(Tekev,Zeff,fc,uth,u,gam,fk,dfk)
fk=fk*(4.0d0/amu**2)
dfk=dfk*(2.0d0/amu)*bth
alam=upr2/u2/hb
psi=psinv
call vlambda(alam,psi,fu,dfu)
eta=gam*fu*dfk/u-2.0d0*(anpl-gam*upl/u2)*fk*dfu*upl/u2/hb
if(upl.lt.0) eta=-eta
fjncl=eta*fpp(upl)
return
end
subroutine vlambda(alam,psi,fv,dfv)
implicit real*8 (a-h,o-z)
parameter (nnintp=101,nlam=41)
parameter(ksp=3,njest=nnintp+ksp+1,nlest=nlam+ksp+1)
parameter(lwrk=4*(nnintp+nlam)+11*(njest+nlest)+
. njest*nnintp+nlest+54)
parameter(kwrk=nnintp+nlam+njest+nlest+3)
parameter(lw01=nnintp*4+nlam*3+nnintp*nlam)
external fpbisp
dimension xxs(1),yys(1),ffs(1)
dimension ch01(lw01),ch((njest-4)*(nlest-4))
dimension tjp(njest),tlm(nlest)
dimension iwrk(kwrk),wrk(lwrk)
common/coffvl/ch
common/coffdvl/ch01
common/coffvlt/tjp,tlm
common/coffvln/njpt,nlmt
njp=njpt
nlm=nlmt
xxs(1)=sqrt(psi)
yys(1)=alam
call fpbisp(tjp,njp,tlm,nlm,ch,ksp,ksp,xxs,1,yys,1,ffs,
. wrk(1),wrk(5),iwrk(1),iwrk(2))
fv=ffs(1)
iwp=1+(njp-4)*(nlm-5)
iwl=iwp+4
call fpbisp(tjp(1),njp,tlm(2),nlm-2,ch01,3,2,
. xxs,1,yys,1,ffs,ch01(iwp),ch01(iwl),iwrk(1),iwrk(2))
dfv=ffs(1)
return
end
subroutine projxyzt(iproj,nfile)
implicit real*8 (a-h,o-z)
parameter(jmx=31,kmx=36)
dimension ywrk(6,jmx,kmx),ypwrk(6,jmx,kmx)
c
common/nray/nrayr,nrayth
common/wrk/ywrk,ypwrk
common/psinv11/psinv11
common/istep/istep
common/ss/st
c
rtimn=1.d+30
rtimx=-1.d-30
c
jd=1
if(iproj.eq.0) jd=nrayr-1
do j=1,nrayr,jd
kkk=nrayth
if(j.eq.1) kkk=1
do k=1,kkk
c
dx=ywrk(1,j,k)-ywrk(1,1,1)
dy=ywrk(2,j,k)-ywrk(2,1,1)
dz=ywrk(3,j,k)-ywrk(3,1,1)
c
dirx=ywrk(4,j,k)
diry=ywrk(5,j,k)
dirz=ywrk(6,j,k)
dir=sqrt(dirx*dirx+diry*diry+dirz*dirz)
c
if(j.eq.1.and.k.eq.1) then
csth1=dirz/dir
snth1=sqrt(1.0d0-csth1**2)
csps1=1.0d0
snps1=0.0d0
if(snth1.gt.0.0d0) then
csps1=diry/(dir*snth1)
snps1=dirx/(dir*snth1)
end if
end if
xti= dx*csps1-dy*snps1
yti=(dx*snps1+dy*csps1)*csth1-dz*snth1
zti=(dx*snps1+dy*csps1)*snth1+dz*csth1
rti=sqrt(xti**2+yti**2)
c
dirxt= (dirx*csps1-diry*snps1)/dir
diryt=((dirx*snps1+diry*csps1)*csth1-dirz*snth1)/dir
dirzt=((dirx*snps1+diry*csps1)*snth1+dirz*csth1)/dir
c
if(k.eq.1) then
xti1=xti
yti1=yti
zti1=zti
rti1=rti
end if
if(.not.(iproj.eq.0.and.j.eq.1))
. write(nfile,111) istep,j,k,xti,yti,zti,rti,psinv11
c
if(rti.ge.rtimx.and.j.eq.nrayr) rtimx=rti
if(rti.le.rtimn.and.j.eq.nrayr) rtimn=rti
c
end do
c
c if(.not.(iproj.eq.0.and.j.eq.1))
c . write(nfile,111) istep,j,k,xti,yti,zti,rti,psinv11
if(iproj.eq.1) write(nfile,*) ' '
end do
c
write(nfile,*) ' '
c
write(12,99) istep,st,psinv11,rtimn,rtimx
return
99 format(i5,12(1x,e16.8e3))
111 format(3i5,12(1x,e16.8e3))
end
c
c
c
subroutine pec(pabs,currt)
implicit real*8(a-h,o-z)
parameter(nndmx=5001,jmx=31,kmx=36,nmx=8000)
parameter(rtbc=1.0d0)
parameter(pi=3.14159265358979d0)
dimension psjki(jmx,kmx,nmx),iiv(jmx,kmx)
dimension ppabs(jmx,kmx,nmx),ccci(jmx,kmx,nmx)
dimension pdjki(jmx,kmx,nmx),currj(jmx,kmx,nmx)
dimension xxi(nmx),ypt(nmx),yamp(nmx)
dimension rtab(nndmx),rhotv(nndmx)
dimension rtab1(0:nndmx)
dimension ajphiv(nndmx),dpdv(nndmx)
dimension dvolt(nndmx),darea(nndmx)
dimension ratjav(nndmx),ratjbv(nndmx),ratjplv(nndmx)
dimension ajplv(nndmx),ajcdav(nndmx),ajcdbv(nndmx)
dimension pins(nndmx),currins(nndmx),fi(nndmx)
parameter(llmx=21)
dimension isev(llmx)
c
common/nray/nrayr,nrayth
common/istep/istep
common/dsds/dst
common/ipec/ipec,nnd
common/ieccd/ieccd
common/index_rt/index_rt
c
common/iiv/iiv
common/psjki/psjki
common/pcjki/ppabs,ccci
common/dpjjki/pdjki,currj
c
common/cent/btrcen,rcen
common/angles/alpha0,beta0
common/iieq/iequil
common/parban/b0,rr0m,zr0m,rpam
common/taumnx/taumn,taumx,pabstot,currtot
common/jmxmn/rhot1,rhot2,aj1,aj2
c
common/polcof/psipol,chipol
c
stf=istep*dst
nd=nnd
if(pabstot.gt.0.0d0) then
do ll=1,llmx
isev(ll)=0
end do
intp=0
voli0=0.0d0
areai0=0.0d0
rtab1(0)=0.0d0
do it=1,nd
drt=1.0d0/dble(nd-1)
rt=dble(it-1)*drt
if(it.lt.nd) then
rt1=rt+drt/2.0d0
else
rt1=rt
end if
rtab(it)=rt
rtab1(it)=rt1
dpdv(it)=0.0d0
ajphiv(it)=0.0d0
if (ipec.eq.0) then
psit=rt
psit1=rt1
else
psit=rt**2
psit1=rt1**2
end if
if(iequil.eq.2) then
rhotv(it)=frhotor(psit)
call valpsispl(sqrt(psit1),voli1,dervoli,areai1,rrii,
. rbavi,bmxi,bmni,fci,intp)
dvolt(it)=abs(voli1-voli0)
darea(it)=abs(areai1-areai0)
voli0=voli1
areai0=areai1
call ratioj(sqrt(psit),ratjai,ratjbi,ratjpli)
ratjav(it)=ratjai
ratjbv(it)=ratjbi
ratjplv(it)=ratjpli
else
rhotv(it)=sqrt(psit)
area1=pi*psit1*rpam**2
voli1=2.0d0*pi*rr0m*area1
dvolt(it)=abs(voli1-voli0)
darea(it)=abs(areai1-areai0)
voli0=voli1
areai0=areai1
end if
end do
kkk=1
do j=1,nrayr
if(j.gt.1) kkk=nrayth
do k=1,kkk
ise0=0
ii=iiv(j,k)
if (ii.lt.nmx.and.psjki(j,k,ii+1).ne.0.0d0) ii=ii+1
idecr=-1
is=1
do i=1,ii
if(ipec.eq.0) xxi(i)=abs(psjki(j,k,i))
if(ipec.eq.1) xxi(i)=sqrt(abs(psjki(j,k,i)))
if(psjki(j,k,i).ge.0.and.psjki(j,k,i).le.rtbc) then
ypt(i)=ppabs(j,k,i)
yamp(i)=ccci(j,k,i)
else
ypt(i)=0.0d0
yamp(i)=0.0d0
end if
if(ise0.eq.0) then
if(xxi(i).lt.rtbc) then
ise0=i
isev(is)=i-1
is=is+1
end if
else
if (idecr.eq.-1) then
if(xxi(i).gt.xxi(i-1)) then
isev(is)=i-1
is=is+1
idecr=1
end if
else
if(xxi(i).gt.rtbc) exit
if(xxi(i).lt.xxi(i-1)) then
isev(is)=i
is=is+1
idecr=-1
end if
end if
end if
end do
c
isev(is)=i-1
ppa1=0.0d0
cci1=0.0d0
do iis=1,is-1
iis1=iis+1
iise0=isev(iis)
iise=isev(iis1)
if (mod(iis,2).ne.0) then
idecr=-1
ind1=nd
ind2=2
iind=-1
else
idecr=1
ind1=1
ind2=nd
iind=1
end if
do ind=ind1,ind2,iind
iind=ind
if (idecr.eq.-1) iind=ind-1
rt1=rtab1(iind)
call locatex(xxi,iise,iise0,iise,rt1,itb1)
if(itb1.gt.iise0.and.itb1.lt.iise) then
call intlin(xxi(itb1),ypt(itb1),xxi(itb1+1),
. ypt(itb1+1),rt1,ppa2)
call intlin(xxi(itb1),yamp(itb1),xxi(itb1+1),
. yamp(itb1+1),rt1,cci2)
dppa=ppa2-ppa1
dpdv(ind)=dpdv(ind)+dppa
didst=(cci2-cci1)
ajphiv(ind)=ajphiv(ind)+didst
ppa1=ppa2
cci1=cci2
end if
end do
end do
end do
end do
h=1.0d0/dble(nd-1)
rhotpav=0.0d0
drhotpav=0.0d0
rhotjav=0.0d0
rhotjava=0.0d0
rhot2java=0.0d0
fi=dpdv/h
call simpson (nd,h,fi,spds)
fi=rhotv*dpdv/h
call simpson (nd,h,fi,rhotpav)
fi=rhotv*rhotv*dpdv/h
call simpson (nd,h,fi,rhot2pav)
rhotpav=rhotpav/spds
rhot2pav=rhot2pav/spds
if (ieccd.ne.0) then
fi=ajphiv/h
call simpson (nd,h,fi,sccs)
fi=rhotv*ajphiv/h
call simpson (nd,h,fi,rhotjav)
fi=abs(ajphiv)/h
call simpson (nd,h,fi,sccsa)
fi=rhotv*abs(ajphiv)/h
call simpson (nd,h,fi,rhotjava)
fi=rhotv*rhotv*abs(ajphiv)/h
call simpson (nd,h,fi,rhot2java)
rhotjav=rhotjav/sccs
rhotjava=rhotjava/sccsa
rhot2java=rhot2java/sccsa
end if
c factor sqrt(8)=2 sqrt(2) to match with full width
c of gaussian profile
drhot2pav=rhot2pav-rhotpav**2
drhotpav=sqrt(8.d0*drhot2pav)
drhot2java=rhot2java-rhotjava**2
drhotjava=sqrt(8.d0*drhot2java)
spds=0.0d0
sccs=0.0d0
do i=1,nd
spds=spds+dpdv(i)
sccs=sccs+ajphiv(i)
pins(i)=spds
currins(i)=sccs
dpdv(i)=dpdv(i)/dvolt(i)
ajphiv(i)=ajphiv(i)/darea(i)
end do
facpds=1.0d0
facjs=1.0d0
if(spds.gt.0.0d0) facpds=pabs/spds
if(sccs.ne.0.0d0) facjs=currt/sccs
do i=1,nd
dpdv(i)=facpds*dpdv(i)
ajphiv(i)=facjs*ajphiv(i)
ajcdav(i)=ajphiv(i)*ratjav(i)
ajcdbv(i)=ajphiv(i)*ratjbv(i)
ajplv(i)=ajphiv(i)*ratjplv(i)
end do
call profwidth(nd,rtab,dpdv,rhotp,rhopp,dpdvmx,
. drhotp,drhopp)
if(ieccd.ne.0) then
call profwidth(nd,rtab,ajphiv,rhotjfi,rhopfi,ajmxfi,
. drhotjfi,drhopfi)
xps=rhopfi
call ratioj(rhopfi,ratjamx,ratjbmx,ratjplmx)
else
rhotjfi=0.0d0
rhopfi=0.0d0
ajmxfi=0.0d0
drhotjfi=0.0d0
drhopfi=0.0d0
xps=rhopp
ratjamx=1.0d0
ratjbmx=1.0d0
ratjplmx=1.0d0
end if
iif1=iiv(1,1)
istmx=1
do i=2,iif1
if(psjki(1,1,i).ge.0.0d0) then
if(pdjki(1,1,i).gt.pdjki(1,1,i-1)) istmx=i
end if
end do
stmx=istmx*dst
pins_02=0.0d0
pins_05=0.0d0
pins_085=0.0d0
xrhot=0.2d0
call locate(rhotv,nd,xrhot,i1)
call intlin(rhotv(i1),pins(i1),rhotv(i1+1),pins(i1+1),
. xrhot,pins_02)
xrhot=0.5d0
call locate(rhotv,nd,xrhot,i1)
call intlin(rhotv(i1),pins(i1),rhotv(i1+1),pins(i1+1),
. xrhot,pins_05)
xrhot=0.85d0
call locate(rhotv,nd,xrhot,i1)
call intlin(rhotv(i1),pins(i1),rhotv(i1+1),pins(i1+1),
. xrhot,pins_085)
else
ajmxfi=0.0d0
dpdvmx=0.0d0
rhotjfi=1.0d0
rhotjav=1.0d0
rhotjava=1.0d0
rhotp=1.0d0
rhotpav=1.0d0
drhotjfi=0.0d0
drhotjava=0.0d0
drhotp=0.0d0
drhotpav=0.0d0
taumn=0
taumx=0
stmx=stf
pins_02=0.0d0
pins_05=0.0d0
pins_085=0.0d0
c end of pabstot > 0
end if
c dPdV [MW/m^3], Jcd [MA/m^2]
if(ieccd.eq.0) currt=0.0d0
currtka=currt*1.0d3
write(6,*)' '
write(6,*)'#beta0 alpha0 Icd Pa Jphimx dPdVmx '//
.'rhotj rhotjava rhotp rhotpav '//
.'drhotjava drhotpav ratjbmx stmx psipol chipol index_rt'
write(6,99) beta0,alpha0,currtka,pabstot,ajmxfi,dpdvmx,
. rhotjfi,rhotjava,rhotp,rhotpav,
. drhotjava,drhotpav,
. stmx,psipol,chipol,real(index_rt)
write(7,99) currtka,pabstot,ajmxfi,dpdvmx,
. rhotjfi,rhotjava,rhotp,rhotpav,
. drhotjava,drhotpav,ratjbmx,
. stmx,psipol,chipol,real(index_rt)
do i=1,nd
if (ipec.eq.0) then
psin=rtab(i)
rhop=sqrt(rtab(i))
else
psin=rtab(i)**2
rhop=rtab(i)
end if
pinsr=0.0d0
if(pabstot.gt.0) pinsr=pins(i)/pabstot
write(48,99) psin,rhotv(i),ajphiv(i),ajcdbv(i),dpdv(i),
. currins(i),pins(i),pinsr,real(index_rt)
end do
return
49 format(i5,20(1x,e12.5))
99 format(30(1x,e12.5))
end
c
c
c
subroutine profwidth(nd,xx,yy,rhotmx,rhopmx,ypk,drhot,drhop)
implicit real*8(a-h,o-z)
parameter(emn1=0.367879441171442d0)
dimension xx(nd),yy(nd)
common/jmxmn/rhotp,rhotm,ypkp,ypkm
common/ipec/ipec,nnd
common/iieq/iequil
c
call vmaxmini(yy,nd,ymn,ymx,imn,imx)
ypk=0.0d0
xmx=xx(imx)
xmn=xx(imn)
if (abs(ymx).gt.abs(ymn)) then
ipk=imx
ypkp=ymx
xpkp=xmx
if(abs(ymn/ymx).lt.1d-2) ymn=0.0d0
ypkm=ymn
xpkm=xmn
else
ipk=imn
ypkp=ymn
xpkp=xmn
if(abs(ymx/ymn).lt.1d-2) ymx=0.0d0
ypkm=ymx
xpkm=xmx
end if
if(xpkp.gt.0.0d0) then
xpk=xpkp
ypk=ypkp
yye=ypk*emn1
call locatex(yy,nd,1,ipk,yye,ie1)
if(ie1.gt.0.and.ie1.lt.nd) then
call intlin(yy(ie1),xx(ie1),yy(ie1+1),xx(ie1+1),yye,rte1)
else
rte1=0.0d0
end if
call locatex(yy,nd,ipk,nd,yye,ie2)
call intlin(yy(ie2),xx(ie2),yy(ie2+1),xx(ie2+1),yye,rte2)
else
ipk=2
xpk=xx(2)
ypk=yy(2)
rte1=0.0d0
yye=ypk*emn1
call locate(yy,nd,yye,ie2)
call intlin(yy(ie2),xx(ie2),yy(ie1+2),xx(ie1+2),yye,rte2)
end if
c
ipk=1
if(ymx.ne.0.and.ymn.ne.0) ipk=2
c
drhop=0.0d0
drhot=0.0d0
psie1=0.0d0
psie2=1.0d0
rhopmx=1.0d0
rhopmn=0.0d0
if (ie1.gt.0.or.ie2.gt.0) then
if(ipec.eq.0) then
rhopmx=sqrt(xpkp)
rhopmn=sqrt(xpkm)
psie2=rte2
psie1=rte1
drhop=sqrt(rte2)-sqrt(rte1)
else
rhopmx=xpkp
rhopmn=xpkm
drhop=rte2-rte1
psie2=rte2**2
psie1=rte1**2
end if
end if
c
if(iequil.eq.2) then
rhotmx=frhotor(rhopmx**2)
rhotmn=frhotor(rhopmn**2)
rhote2=frhotor(psie2)
rhote1=frhotor(psie1)
drhot=rhote2-rhote1
else
rhotmx=rhopmx
rhotmn=rhopmn
drhot=drhop
end if
c
if(ipk.eq.2) then
drhop=-drhop
drhot=-drhot
end if
ypk=ypkp
rhotp=rhotmx
rhotm=rhotmn
c
return
end
c
subroutine polarcold(exf,eyif,ezf,elf,etf)
implicit real*8(a-h,o-z)
common/nplr/anpl,anpr
common/xgxg/xg
common/ygyg/yg
common/mode/sox
c
c dcold dispersion
c dielectric tensor (transposed)
c
c exf=0.0d0
c eyif=0.0d0
c ezf=0.0d0
c if(xg.le.0) return
c
anpl2=anpl*anpl
anpr2=anpr*anpr
an2=anpl2+anpr2
yg2=yg**2
dy2=1.0d0-yg2
aa=1.0d0-xg-yg2
e3=1.0d0-xg
c
if(xg.gt.0.0d0) then
if (anpl.ne.0.0d0) then
qq=xg*yg/(an2*dy2-aa)
p=(anpr2-e3)/(anpl*anpr)
ezf=1.0d0/sqrt(1.0d0+p*p*(1.0d0+qq*qq))
exf=p*ezf
eyif=qq*exf
else
if(sox.lt.0.d0) then
ezf=1
exf=0
eyif=0
else
ezf=0
qq=-aa/(xg*yg)
exf=1.0d0/sqrt(1.0d0+qq*qq)
eyif=qq*exf
end if
end if
elf=(anpl*ezf+anpr*exf)/sqrt(an2)
etf=sqrt(1.0d0-elf*elf)
else
if(sox.lt.0.0d0) then
ezf=1
exf=0
eyif=0
else
ezf=0
exf=0.0d0
eyif=1.0d0
end if
elf=0
etf=1
end if
c
return
end
subroutine pol_limit(qq,uu,vv)
implicit none
integer*4 ipolc
real*8 bv(3),anv(3)
real*8 anx,any,anz,anpl,anpr,yg,xe2om,ye2om,xe2xm,ye2xm
real*8 an2,an,anxy,sngam,csgam,csg2,sng2,ffo,ffx,ffo2,ffx2
real*8 deno,denx,anpl2,dnl,del0
real*8 uuom,vvom,qqom,uuxm,vvxm,qqxm,ellom,ellxm,qq,uu,vv
real*8 aaom,bbom,llmom,aaxm,bbxm,llmxm,psiom,psixm,chiom,chixm
real*8 pi,beta0,alpha0,gam
real*8 sox,psipol,chipol
complex*16 ui,exom,eyom,exxm,eyxm,ext,eyt
parameter(ui=(0.0d0,1.0d0),pi=3.14159265358979d0)
c
common/anv/anv
common/nplr/anpl,anpr
common/ygyg/yg
common/bb/bv
common/angles/alpha0,beta0
common/mode/sox
common/polcof/psipol,chipol
common/ipol/ipolc
common/evt/ext,eyt
c
anx=anv(1)
any=anv(2)
anz=anv(3)
anpl2=anpl*anpl
dnl=1.0d0-anpl2
del0=sqrt(dnl**2+4.0d0*anpl2/yg**2)
ffo=0.5d0*yg*(dnl+del0)
ffx=0.5d0*yg*(dnl-del0)
an2=anx*anx+any*any+anz*anz
an=sqrt(an2)
anxy=sqrt(anx*anx+any*any)
sngam=(anz*anpl-an2*bv(3))/(an*anxy*anpr)
csgam=-(any*bv(1)-anx*bv(2))/anxy/anpr
csg2=csgam**2
sng2=sngam**2
ffo2=ffo*ffo
ffx2=ffx*ffx
deno=ffo2+anpl2
denx=ffx2+anpl2
xe2om=(ffo2*csg2+anpl2*sng2)/deno
ye2om=(ffo2*sng2+anpl2*csg2)/deno
xe2xm=(ffx2*csg2+anpl2*sng2)/denx
ye2xm=(ffx2*sng2+anpl2*csg2)/denx
c
exom=(ffo*csgam-ui*anpl*sngam)/sqrt(deno)
eyom=(-ffo*sngam-ui*anpl*csgam)/sqrt(deno)
qqom=abs(exom)**2-abs(eyom)**2
uuom=2.0d0*dble(exom*dconjg(eyom))
vvom=2.0d0*dimag(exom*dconjg(eyom))
llmom=sqrt(qqom**2+uuom**2)
aaom=sqrt((1+llmom)/2.0d0)
bbom=sqrt((1-llmom)/2.0d0)
ellom=bbom/aaom
psiom=0.5d0*atan2(uuom,qqom)*180.d0/pi
chiom=0.5d0*asin(vvom)*180.d0/pi
c
exxm=(ffx*csgam-ui*anpl*sngam)/sqrt(denx)
eyxm=(-ffx*sngam-ui*anpl*csgam)/sqrt(denx)
qqxm=abs(exxm)**2-abs(eyxm)**2
uuxm=2.0d0*dble(exxm*dconjg(eyxm))
vvxm=2.0d0*dimag(exxm*dconjg(eyxm))
llmxm=sqrt(qqxm**2+uuxm**2)
aaxm=sqrt((1+llmxm)/2.0d0)
bbxm=sqrt((1-llmxm)/2.0d0)
ellxm=bbxm/aaxm
psixm=0.5d0*atan2(uuxm,qqxm)*180.d0/pi
chixm=0.5d0*asin(vvxm)*180.d0/pi
c
if (sox.lt.0.0d0) then
psipol=psiom
chipol=chiom
ext=exom
eyt=eyom
qq=qqom
vv=vvom
uu=uuom
else
psipol=psixm
chipol=chixm
ext=exxm
eyt=eyxm
qq=qqxm
vv=vvxm
uu=uuxm
endif
gam=atan(sngam/csgam)*180.d0/pi
return
111 format(20(1x,e12.5))
end
subroutine wall_refl(xvrfl,anvrfl,qqtr,uutr,vvtr,irfl)
implicit none
integer*4 ivac,irfl
real*8 anv(3),xv(3),xvrfl(3)
real*8 walln(3),anvrfl(3),vv1(3),vv2(3),vv3(3),xvout(3)
real*8 uutr,vvtr,qqtr,qq,uu,vv
real*8 pi
real*8 psipol,chipol,psitr,chitr
complex*16 ui,extr,eytr,eztr,ext,eyt
complex*16 evin(3),evrfl(3)
parameter(ui=(0.0d0,1.0d0),pi=3.14159265358979d0)
common/xv/xv
common/anv/anv
common/polcof/psipol,chipol
common/evt/ext,eyt
common/wrefl/walln
anv=anv/sqrt(anv(1)**2+anv(2)**2+anv(3)**2)
c computation of reflection coordinates and normal to the wall
irfl=1
ivac=1
call vacuum_rt(xv,xvout,ivac)
if(ivac.lt.0) then
irfl=0
xvrfl=xvout
xv=xvout
anvrfl=anv
return
end if
c rotation matrix from local to lab frame
vv1(1)=anv(2)
vv1(2)=-anv(1)
vv1(3)=0.0d0
vv2(1)=anv(1)*anv(3)
vv2(2)=anv(2)*anv(3)
vv2(3)=-anv(1)*anv(1)-anv(2)*anv(2)
vv1=vv1/sqrt(vv1(1)**2+vv1(2)**2+vv1(3)**2)
vv2=vv2/sqrt(vv2(1)**2+vv2(2)**2+vv2(3)**2)
vv3=anv
evin=ext*vv1+eyt*vv2
c wave vector and electric field after reflection in lab frame
anvrfl=anv-2.0d0*
. (anv(1)*walln(1)+anv(2)*walln(2)+anv(3)*walln(3))*walln
evrfl=-evin+2.0d0*
. (evin(1)*walln(1)+evin(2)*walln(2)+evin(3)*walln(3))*walln
vv1(1)=anvrfl(2)
vv1(2)=-anvrfl(1)
vv1(3)=0.0d0
vv2(1)=anvrfl(1)*anvrfl(3)
vv2(2)=anvrfl(2)*anvrfl(3)
vv2(3)=-anvrfl(1)*anvrfl(1)-anvrfl(2)*anvrfl(2)
vv1=vv1/sqrt(vv1(1)**2+vv1(2)**2+vv1(3)**2)
vv2=vv2/sqrt(vv2(1)**2+vv2(2)**2+vv2(3)**2)
vv3=anvrfl/sqrt(anvrfl(1)**2+anvrfl(2)**2+anvrfl(3)**2)
extr=dot_product(vv1,evrfl)
eytr=dot_product(vv2,evrfl)
eztr=dot_product(vv3,evrfl)
qqtr=abs(extr)**2-abs(eytr)**2
uutr=2.0d0*dble(extr*dconjg(eytr))
vvtr=2.0d0*dimag(extr*dconjg(eytr))
psitr=0.5d0*atan2(uutr,qqtr)*180.d0/pi
chitr=0.5d0*asin(vvtr)*180.d0/pi
ivac=2
anv=anvrfl
xvrfl=xvout
xv=xvout
call vacuum_rt(xv,xvout,ivac)
xv=xvout
return
111 format(20(1x,e12.5))
end
subroutine vacuum_rt(xvstart,xvend,ivac)
use reflections, only : inters_linewall,inside
implicit none
integer*4 ivac
integer nbb,nlim,i,imax
parameter(nbb=1000)
real*8 st,rrm,zzm,psinv,dst,psdbnd,dstvac,smax
real*8 anv(3),xvstart(3),xvend(3),walln(3),y(6),dery(6)
real*8 xv0(3)
real*8 rlim(nbb),zlim(nbb)
common/wrefl/walln
common/limiter/rlim,zlim,nlim
common/anv/anv
common/dsds/dst
common/psival/psinv
common/densbnd/psdbnd
common/dstvac/dstvac
c ivac=1 first interface plasma-vacuum
c ivac=2 second interface vacuum-plasma after wall reflection
c ivac=-1 second interface vacuum-plasma WITHOUT wall reflection
! the real argument associated to xvstart is in a common block
! used by fwork!!!
xv0=xvstart
call inters_linewall(xv0/1.d2,anv,rlim(1:nlim),zlim(1:nlim),
. nlim,smax,walln)
smax=smax*1.d2
rrm=1.d-2*sqrt(xv0(1)**2+xv0(2)**2)
zzm=1.d-2*xv0(3)
if (.not.inside(rlim,zlim,nlim,rrm,zzm)) then
! first wall interface is outside-inside
if (dot_product(walln,walln)<tiny(walln)) then
! wall never hit
dstvac=0.0d0
xvend=xv0
ivac=-1
return
end if
! search second wall interface (inside-outside)
st=smax
xvend=xv0+st*anv
call inters_linewall(xvend/1.d2,anv,rlim(1:nlim),zlim(1:nlim),
. nlim,smax,walln)
smax=smax*1.d2+st
end if
i=0
do
st=i*dst
xvend=xv0+st*anv
y(1)=xvend(1)
y(2)=xvend(2)
y(3)=xvend(3)
y(4)=anv(1)
y(5)=anv(2)
y(6)=anv(3)
call fwork(y,dery)
if (st.ge.smax.or.(psinv.gt.0.0d0.and.psinv.lt.psdbnd)) exit
i=i+1
end do
if (st.lt.smax) then
ivac=-1
dstvac=st
else
dstvac=smax
xvend=xv0+smax*anv
end if
! the real argument associated to xvstart is in a common block
! used by fwork!!!
xvstart=xv0
return
111 format(20(1x,e12.5))
end