Hlambda function now evaluated from 1D spline in fjncl integration (mom. cons. CD model). Cleaned unused variables.

This commit is contained in:
Lorenzo Figini 2015-06-15 15:35:15 +00:00
parent f755232b01
commit 20e68d468f
4 changed files with 328 additions and 332 deletions

View File

@ -57,7 +57,7 @@ contains
return
end if
else
ti=cmplx(0._wp_,tau)
ti=cmplx(0._wp_,tau,wp_)
!
if((-1._wp_ < x .and. x <= 0.0_wp_).or. &
(0.0_wp_ < x .and. x <= 0.1_wp_ .and.tau<= 17.0_wp_).or. &
@ -316,7 +316,7 @@ contains
return
end if
f=abs(t)
v=cmplx(x,f)
v=cmplx(x,f,wp_)
if(x < 0.0_wp_) v=1.0_wp_-v
h=(0.0_wp_,0.0_wp_)
c=real(v)
@ -327,7 +327,7 @@ contains
a=atan2(d,c)
do i = 1,n
c=c+1.0_wp_
v=cmplx(c,d)
v=cmplx(c,d,wp_)
h=h*v
a=a+atan2(d,c)
end do
@ -347,7 +347,7 @@ contains
f=sin(c)
e=d+0.5_wp_*log(e*f**2+0.25_wp_*(1.0_wp_-e)**2)
f=atan2(cos(c)*tanh(d),f)-a*pi
clogam=1.1447298858494_wp_-cmplx(e,f)-clogam
clogam=1.1447298858494_wp_-cmplx(e,f,wp_)-clogam
!
end if
if(t < 0.0_wp_) clogam=conjg(clogam)

View File

@ -629,278 +629,278 @@ contains
result = ei
end subroutine calcei3
subroutine calerf(arg,result,jintt)
!------------------------------------------------------------------
! subroutine calerf(arg,result,jintt)
!!------------------------------------------------------------------
!!
!! this packet evaluates erf(x), erfc(x), and exp(x*x)*erfc(x)
!! for a real argument x. it contains three function type
!! subprograms: erf, erfc, and erfcx (or derf, derfc, and derfcx),
!! and one subroutine type subprogram, calerf. the calling
!! statements for the primary entries are:
!!
!! y=erf(x) (or y=derf(x)),
!!
!! y=erfc(x) (or y=derfc(x)),
!! and
!! y=erfcx(x) (or y=derfcx(x)).
!!
!! the routine calerf is intended for internal packet use only,
!! all computations within the packet being concentrated in this
!! routine. the function subprograms invoke calerf with the
!! statement
!!
!! call calerf(arg,result,jintt)
!!
!! where the parameter usage is as follows
!!
!! function parameters for calerf
!! call arg result jintt
!!
!! erf(arg) any real argument erf(arg) 0
!! erfc(arg) abs(arg) < xbig erfc(arg) 1
!! erfcx(arg) xneg < arg < xmax erfcx(arg) 2
!!
!!*******************************************************************
!!*******************************************************************
!!
!! Explanation of machine-dependent constants
!!
!! XMIN = the smallest positive floating-point number.
!! XINF = the largest positive finite floating-point number.
!! XNEG = the largest negative argument acceptable to ERFCX;
!! the negative of the solution to the equation
!! 2*exp(x*x) = XINF.
!! XSMALL = argument below which erf(x) may be represented by
!! 2*x/sqrt(pi) and above which x*x will not underflow.
!! A conservative value is the largest machine number X
!! such that 1.0 + X = 1.0 to machine precision.
!! XBIG = largest argument acceptable to ERFC; solution to
!! the equation: W(x) * (1-0.5/x**2) = XMIN, where
!! W(x) = exp(-x*x)/[x*sqrt(pi)].
!! XHUGE = argument above which 1.0 - 1/(2*x*x) = 1.0 to
!! machine precision. A conservative value is
!! 1/[2*sqrt(XSMALL)]
!! XMAX = largest acceptable argument to ERFCX; the minimum
!! of XINF and 1/[sqrt(pi)*XMIN].
!!
!!*******************************************************************
!!*******************************************************************
!!
!! error returns
!!
!! the program returns erfc = 0 for arg >= xbig;
!!
!! erfcx = xinf for arg < xneg;
!! and
!! erfcx = 0 for arg >= xmax.
!!
!!
!! intrinsic functions required are:
!!
!! abs, aint, exp
!!
!!
!! author: w. j. cody
!! mathematics and computer science division
!! argonne national laboratory
!! argonne, il 60439
!!
!! latest modification: march 19, 1990
!!
!!------------------------------------------------------------------
! implicit none
! real(wp_), intent(in) :: arg
! real(wp_), intent(out) :: result
! integer, intent(in) :: jintt
! integer :: i
! real(wp_) :: del,x,xden,xnum,y,ysq
!!------------------------------------------------------------------
!! mathematical constants
!!------------------------------------------------------------------
! real(wp_), parameter :: sqrpi=5.6418958354775628695e-1_wp_, &
! thresh=0.46875_wp_
!!------------------------------------------------------------------
!! machine-dependent constants
!!------------------------------------------------------------------
! real(wp_), parameter :: xinf=1.79e308_wp_, & ! ~huge
! xneg=-26.628_wp_, & ! ?
! xsmall=1.11e-16_wp_, & ! ~epsilon/2
! xbig=26.543_wp_, & ! ?
! xhuge=6.71e7_wp_, & ! ~1/sqrt(epsilon)
! xmax=2.53e307_wp_ ! ?
!!------------------------------------------------------------------
!! coefficients for approximation to erf in first interval
!!------------------------------------------------------------------
! real(wp_), dimension(5), parameter :: &
! a=(/3.16112374387056560_wp_,1.13864154151050156e02_wp_, &
! 3.77485237685302021e02_wp_,3.20937758913846947e03_wp_, &
! 1.85777706184603153e-1_wp_/)
! real(wp_), dimension(4), parameter :: &
! b=(/2.36012909523441209e01_wp_,2.44024637934444173e02_wp_, &
! 1.28261652607737228e03_wp_,2.84423683343917062e03_wp_/)
!!------------------------------------------------------------------
!! coefficients for approximation to erfc in second interval
!!------------------------------------------------------------------
! real(wp_), dimension(9), parameter :: &
! c=(/5.64188496988670089e-1_wp_,8.88314979438837594_wp_, &
! 6.61191906371416295e01_wp_,2.98635138197400131e02_wp_, &
! 8.81952221241769090e02_wp_,1.71204761263407058e03_wp_, &
! 2.05107837782607147e03_wp_,1.23033935479799725e03_wp_, &
! 2.15311535474403846e-8_wp_/)
! real(wp_), dimension(8), parameter :: &
! d=(/1.57449261107098347e01_wp_,1.17693950891312499e02_wp_, &
! 5.37181101862009858e02_wp_,1.62138957456669019e03_wp_, &
! 3.29079923573345963e03_wp_,4.36261909014324716e03_wp_, &
! 3.43936767414372164e03_wp_,1.23033935480374942e03_wp_/)
!!------------------------------------------------------------------
!! coefficients for approximation to erfc in third interval
!!------------------------------------------------------------------
! real(wp_), dimension(6), parameter :: &
! p=(/3.05326634961232344e-1_wp_,3.60344899949804439e-1_wp_, &
! 1.25781726111229246e-1_wp_,1.60837851487422766e-2_wp_, &
! 6.58749161529837803e-4_wp_,1.63153871373020978e-2_wp_/)
! real(wp_), dimension(5), parameter :: &
! q=(/2.56852019228982242_wp_,1.87295284992346047_wp_, &
! 5.27905102951428412e-1_wp_,6.05183413124413191e-2_wp_, &
! 2.33520497626869185e-3_wp_/)
!!------------------------------------------------------------------
! x = arg
! y = abs(x)
! if (y <= thresh) then
!!------------------------------------------------------------------
!! evaluate erf for |x| <= 0.46875
!!------------------------------------------------------------------
! ysq = zero
! if (y > xsmall) ysq = y * y
! xnum = a(5)*ysq
! xden = ysq
! do i = 1, 3
! xnum = (xnum + a(i)) * ysq
! xden = (xden + b(i)) * ysq
! end do
! result = x * (xnum + a(4)) / (xden + b(4))
! if (jintt /= 0) result = one - result
! if (jintt == 2) result = exp(ysq) * result
! return
!!------------------------------------------------------------------
!! evaluate erfc for 0.46875 <= |x| <= 4.0
!!------------------------------------------------------------------
! else if (y <= four) then
! xnum = c(9)*y
! xden = y
! do i = 1, 7
! xnum = (xnum + c(i)) * y
! xden = (xden + d(i)) * y
! end do
! result = (xnum + c(8)) / (xden + d(8))
! if (jintt /= 2) then
! ysq = aint(y*sixten)/sixten
! del = (y-ysq)*(y+ysq)
! result = exp(-ysq*ysq) * exp(-del) * result
! end if
!!------------------------------------------------------------------
!! evaluate erfc for |x| > 4.0
!!------------------------------------------------------------------
! else if (y < xbig .or. (y < xmax .and. jintt == 2)) then
! ysq = one / (y * y)
! xnum = p(6)*ysq
! xden = ysq
! do i = 1, 4
! xnum = (xnum + p(i)) * ysq
! xden = (xden + q(i)) * ysq
! end do
! result = ysq *(xnum + p(5)) / (xden + q(5))
! result = (sqrpi - result) / y
! if (jintt /= 2) then
! ysq = aint(y*sixten)/sixten
! del = (y-ysq)*(y+ysq)
! result = exp(-ysq*ysq) * exp(-del) * result
! end if
! else if (y >= xhuge) then
! result = sqrpi / y
! else
! result = zero
! end if
!!------------------------------------------------------------------
!! fix up for negative argument, erf, etc.
!!------------------------------------------------------------------
! if (jintt == 0) then
! result = (half - result) + half
! if (x < zero) result = -result
! else if (jintt == 1) then
! if (x < zero) result = two - result
! else
! if (x < zero) then
! if (x < xneg) then
! result = xinf
! else
! ysq = aint(x*sixten)/sixten
! del = (x-ysq)*(x+ysq)
! y = exp(ysq*ysq) * exp(del)
! result = (y+y) - result
! end if
! end if
! end if
! end subroutine calerf
!
! this packet evaluates erf(x), erfc(x), and exp(x*x)*erfc(x)
! for a real argument x. it contains three function type
! subprograms: erf, erfc, and erfcx (or derf, derfc, and derfcx),
! and one subroutine type subprogram, calerf. the calling
! statements for the primary entries are:
! function derf(x)
!!--------------------------------------------------------------------
!!
!! this subprogram computes approximate values for erf(x).
!! (see comments heading calerf).
!!
!! author/date: w. j. cody, january 8, 1985
!!
!!--------------------------------------------------------------------
! implicit none
! real(wp_) :: derf
! real(wp_), intent(in) :: x
! integer :: jintt
! real(wp_) :: result
!!------------------------------------------------------------------
! jintt = 0
! call calerf(x,result,jintt)
! derf = result
! end function derf
!
! y=erf(x) (or y=derf(x)),
! function derfc(x)
!!--------------------------------------------------------------------
!!
!! this subprogram computes approximate values for erfc(x).
!! (see comments heading calerf).
!!
!! author/date: w. j. cody, january 8, 1985
!!
!!--------------------------------------------------------------------
! implicit none
! real(wp_) :: derfc
! real(wp_), intent(in) :: x
! integer :: jintt
! real(wp_) :: result
!!------------------------------------------------------------------
! jintt = 1
! call calerf(x,result,jintt)
! derfc = result
! end function derfc
!
! y=erfc(x) (or y=derfc(x)),
! and
! y=erfcx(x) (or y=derfcx(x)).
!
! the routine calerf is intended for internal packet use only,
! all computations within the packet being concentrated in this
! routine. the function subprograms invoke calerf with the
! statement
!
! call calerf(arg,result,jintt)
!
! where the parameter usage is as follows
!
! function parameters for calerf
! call arg result jintt
!
! erf(arg) any real argument erf(arg) 0
! erfc(arg) abs(arg) < xbig erfc(arg) 1
! erfcx(arg) xneg < arg < xmax erfcx(arg) 2
!
!*******************************************************************
!*******************************************************************
!
! Explanation of machine-dependent constants
!
! XMIN = the smallest positive floating-point number.
! XINF = the largest positive finite floating-point number.
! XNEG = the largest negative argument acceptable to ERFCX;
! the negative of the solution to the equation
! 2*exp(x*x) = XINF.
! XSMALL = argument below which erf(x) may be represented by
! 2*x/sqrt(pi) and above which x*x will not underflow.
! A conservative value is the largest machine number X
! such that 1.0 + X = 1.0 to machine precision.
! XBIG = largest argument acceptable to ERFC; solution to
! the equation: W(x) * (1-0.5/x**2) = XMIN, where
! W(x) = exp(-x*x)/[x*sqrt(pi)].
! XHUGE = argument above which 1.0 - 1/(2*x*x) = 1.0 to
! machine precision. A conservative value is
! 1/[2*sqrt(XSMALL)]
! XMAX = largest acceptable argument to ERFCX; the minimum
! of XINF and 1/[sqrt(pi)*XMIN].
!
!*******************************************************************
!*******************************************************************
!
! error returns
!
! the program returns erfc = 0 for arg >= xbig;
!
! erfcx = xinf for arg < xneg;
! and
! erfcx = 0 for arg >= xmax.
!
!
! intrinsic functions required are:
!
! abs, aint, exp
!
!
! author: w. j. cody
! mathematics and computer science division
! argonne national laboratory
! argonne, il 60439
!
! latest modification: march 19, 1990
!
!------------------------------------------------------------------
implicit none
real(wp_), intent(in) :: arg
real(wp_), intent(out) :: result
integer, intent(in) :: jintt
integer :: i
real(wp_) :: del,x,xden,xnum,y,ysq
!------------------------------------------------------------------
! mathematical constants
!------------------------------------------------------------------
real(wp_), parameter :: sqrpi=5.6418958354775628695e-1_wp_, &
thresh=0.46875_wp_
!------------------------------------------------------------------
! machine-dependent constants
!------------------------------------------------------------------
real(wp_), parameter :: xinf=1.79e308_wp_, & ! ~huge
xneg=-26.628_wp_, & ! ?
xsmall=1.11e-16_wp_, & ! ~epsilon/2
xbig=26.543_wp_, & ! ?
xhuge=6.71e7_wp_, & ! ~1/sqrt(epsilon)
xmax=2.53e307_wp_ ! ?
!------------------------------------------------------------------
! coefficients for approximation to erf in first interval
!------------------------------------------------------------------
real(wp_), dimension(5), parameter :: &
a=(/3.16112374387056560_wp_,1.13864154151050156e02_wp_, &
3.77485237685302021e02_wp_,3.20937758913846947e03_wp_, &
1.85777706184603153e-1_wp_/)
real(wp_), dimension(4), parameter :: &
b=(/2.36012909523441209e01_wp_,2.44024637934444173e02_wp_, &
1.28261652607737228e03_wp_,2.84423683343917062e03_wp_/)
!------------------------------------------------------------------
! coefficients for approximation to erfc in second interval
!------------------------------------------------------------------
real(wp_), dimension(9), parameter :: &
c=(/5.64188496988670089e-1_wp_,8.88314979438837594_wp_, &
6.61191906371416295e01_wp_,2.98635138197400131e02_wp_, &
8.81952221241769090e02_wp_,1.71204761263407058e03_wp_, &
2.05107837782607147e03_wp_,1.23033935479799725e03_wp_, &
2.15311535474403846e-8_wp_/)
real(wp_), dimension(8), parameter :: &
d=(/1.57449261107098347e01_wp_,1.17693950891312499e02_wp_, &
5.37181101862009858e02_wp_,1.62138957456669019e03_wp_, &
3.29079923573345963e03_wp_,4.36261909014324716e03_wp_, &
3.43936767414372164e03_wp_,1.23033935480374942e03_wp_/)
!------------------------------------------------------------------
! coefficients for approximation to erfc in third interval
!------------------------------------------------------------------
real(wp_), dimension(6), parameter :: &
p=(/3.05326634961232344e-1_wp_,3.60344899949804439e-1_wp_, &
1.25781726111229246e-1_wp_,1.60837851487422766e-2_wp_, &
6.58749161529837803e-4_wp_,1.63153871373020978e-2_wp_/)
real(wp_), dimension(5), parameter :: &
q=(/2.56852019228982242_wp_,1.87295284992346047_wp_, &
5.27905102951428412e-1_wp_,6.05183413124413191e-2_wp_, &
2.33520497626869185e-3_wp_/)
!------------------------------------------------------------------
x = arg
y = abs(x)
if (y <= thresh) then
!------------------------------------------------------------------
! evaluate erf for |x| <= 0.46875
!------------------------------------------------------------------
ysq = zero
if (y > xsmall) ysq = y * y
xnum = a(5)*ysq
xden = ysq
do i = 1, 3
xnum = (xnum + a(i)) * ysq
xden = (xden + b(i)) * ysq
end do
result = x * (xnum + a(4)) / (xden + b(4))
if (jintt /= 0) result = one - result
if (jintt == 2) result = exp(ysq) * result
return
!------------------------------------------------------------------
! evaluate erfc for 0.46875 <= |x| <= 4.0
!------------------------------------------------------------------
else if (y <= four) then
xnum = c(9)*y
xden = y
do i = 1, 7
xnum = (xnum + c(i)) * y
xden = (xden + d(i)) * y
end do
result = (xnum + c(8)) / (xden + d(8))
if (jintt /= 2) then
ysq = aint(y*sixten)/sixten
del = (y-ysq)*(y+ysq)
result = exp(-ysq*ysq) * exp(-del) * result
end if
!------------------------------------------------------------------
! evaluate erfc for |x| > 4.0
!------------------------------------------------------------------
else if (y < xbig .or. (y < xmax .and. jintt == 2)) then
ysq = one / (y * y)
xnum = p(6)*ysq
xden = ysq
do i = 1, 4
xnum = (xnum + p(i)) * ysq
xden = (xden + q(i)) * ysq
end do
result = ysq *(xnum + p(5)) / (xden + q(5))
result = (sqrpi - result) / y
if (jintt /= 2) then
ysq = aint(y*sixten)/sixten
del = (y-ysq)*(y+ysq)
result = exp(-ysq*ysq) * exp(-del) * result
end if
else if (y >= xhuge) then
result = sqrpi / y
else
result = zero
end if
!------------------------------------------------------------------
! fix up for negative argument, erf, etc.
!------------------------------------------------------------------
if (jintt == 0) then
result = (half - result) + half
if (x < zero) result = -result
else if (jintt == 1) then
if (x < zero) result = two - result
else
if (x < zero) then
if (x < xneg) then
result = xinf
else
ysq = aint(x*sixten)/sixten
del = (x-ysq)*(x+ysq)
y = exp(ysq*ysq) * exp(del)
result = (y+y) - result
end if
end if
end if
end subroutine calerf
function derf(x)
!--------------------------------------------------------------------
!
! this subprogram computes approximate values for erf(x).
! (see comments heading calerf).
!
! author/date: w. j. cody, january 8, 1985
!
!--------------------------------------------------------------------
implicit none
real(wp_) :: derf
real(wp_), intent(in) :: x
integer :: jintt
real(wp_) :: result
!------------------------------------------------------------------
jintt = 0
call calerf(x,result,jintt)
derf = result
end function derf
function derfc(x)
!--------------------------------------------------------------------
!
! this subprogram computes approximate values for erfc(x).
! (see comments heading calerf).
!
! author/date: w. j. cody, january 8, 1985
!
!--------------------------------------------------------------------
implicit none
real(wp_) :: derfc
real(wp_), intent(in) :: x
integer :: jintt
real(wp_) :: result
!------------------------------------------------------------------
jintt = 1
call calerf(x,result,jintt)
derfc = result
end function derfc
function derfcx(x)
!------------------------------------------------------------------
!
! this subprogram computes approximate values for exp(x*x) * erfc(x).
! (see comments heading calerf).
!
! author/date: w. j. cody, march 30, 1987
!
!------------------------------------------------------------------
implicit none
real(wp_) :: derfcx
real(wp_), intent(in) :: x
integer :: jintt
real(wp_) :: result
!------------------------------------------------------------------
jintt = 2
call calerf(x,result,jintt)
derfcx = result
end function derfcx
! function derfcx(x)
!!------------------------------------------------------------------
!!
!! this subprogram computes approximate values for exp(x*x) * erfc(x).
!! (see comments heading calerf).
!!
!! author/date: w. j. cody, march 30, 1987
!!
!!------------------------------------------------------------------
! implicit none
! real(wp_) :: derfcx
! real(wp_), intent(in) :: x
! integer :: jintt
! real(wp_) :: result
!!------------------------------------------------------------------
! jintt = 2
! call calerf(x,result,jintt)
! derfcx = result
! end function derfcx
end module eierf

View File

@ -116,7 +116,7 @@ c
c
subroutine after_gray_integration
use const_and_precisions, only : wp_,zero
use graydata_flags, only : ibeam,iwarm,ilarm,iequil,iprof,
use graydata_flags, only : ibeam,iwarm,iequil,iprof,
. filenmeqq,filenmprf,filenmbm
use graydata_anequil, only : dens0,te0
implicit none
@ -474,7 +474,7 @@ c
c
subroutine print_output(i,j,k)
use const_and_precisions, only : wp_,pi
use graydata_flags, only : iequil,istpl0
use graydata_flags, only : istpl0
use graydata_par, only : psdbnd
implicit none
c local constants
@ -673,7 +673,6 @@ c common/external functions/variables
integer :: nstep,nrayr,nrayth
real(wp_) :: xgcn,ak0,akinv,fhz,wcsi,weta,rcicsi,rcieta,phiw,
. phir,anx0c,any0c,anz0c,x00,y00,z00,bres,p0mw,sox,alpha0,beta0
integer :: length
c
common/xgcn/xgcn
common/nstep/nstep
@ -1116,7 +1115,6 @@ c local variables
c common/external functions/variables
real(wp_) :: wcsi,weta,rcicsi,rcieta,phiw,phir,x00,y00,z00,
. alpha0,beta0,ak0,akinv,fhz
integer :: length
c
common/parbeam/wcsi,weta,rcicsi,rcieta,phiw,phir
common/mirr/x00,y00,z00
@ -1221,10 +1219,10 @@ c
use graydata_par, only : sgnbphi,sgniphi,factb
use interp_eqprof, only : nsrt,nszt,nsft,rlim,zlim,nlim,nr,nz,
. psia,psiant,psinop,btrcen,rcen,btaxis,rmaxis,zmaxis,rmnm,
. rmxm,zmnm,zmxm,dr,dz,zbmin,zbmax,fpolas,phitedge,rrtor,rup,zup,
. rmxm,zmnm,zmxm,dr,dz,zbmin,zbmax,fpolas,phitedge,rup,zup,
. rlw,zlw,tr,tz,tfp,cc=>cceq,cfp,cc01=>cceq01,cc10=>cceq10,
. cc20=>cceq20,cc02=>cceq02,cc11=>cceq11,psinr,qpsi,rv,zv,psin,
. psi,rbbbs,zbbbs,nbbbs,alloc_equilvec,alloc_bnd
. psi,rbbbs,zbbbs,nbbbs,alloc_equilvec,alloc_bnd!,rrtor
implicit none
c local constants
integer, parameter :: kspl=3
@ -2519,7 +2517,7 @@ c
use const_and_precisions, only : wp_,pi
use graydata_par, only : rwallm
use magsurf_data, only : npoints
use interp_eqprof, only : psia,psiant,psinop,nsr=>nsrt,nsz=>nszt,
use interp_eqprof, only : psiant,psinop,nsr=>nsrt,nsz=>nszt,
. cc=>cceq,tr,tz,rup,zup,rlw,zlw,nr
use dierckx, only : profil,sproota
implicit none
@ -3039,9 +3037,8 @@ c
if(allocated(tjp)) deallocate(tjp)
if(allocated(tlm)) deallocate(tlm)
if(allocated(ch)) deallocate(ch)
if(allocated(ch01)) deallocate(ch01)
allocate(tjp(njest),tlm(nlest),ch((njest-4)*(nlest-4)),
. ch01(lw01),rctemp(npoints),zctemp(npoints),stat=ierr)
. rctemp(npoints),zctemp(npoints),stat=ierr)
if (ierr.ne.0) return
c
c computation of flux surface averaged quantities
@ -3360,7 +3357,7 @@ c spline coefficients of rhot
iopt=0
call difcs(rpstab,dvdrhotv,npsi,iopt,cdvdrhot,ier)
c spline interpolation of H(lambda,rhop) and dH/dlambda
c spline interpolation of H(lambda,rhop)
iopt=0
s=0.0_wp_
@ -3370,9 +3367,6 @@ c spline interpolation of H(lambda,rhop) and dH/dlambda
njpt=njp
nlmt=nlm
call coeff_parder(tjp,njp,tlm,nlm,ch,ksp,ksp,0,1,
. ch01,lw01,ier)
c
return
99 format(20(1x,e12.5))
end
@ -5777,9 +5771,9 @@ c
c
subroutine pabs_curr(i,j,k)
use const_and_precisions, only : wp_,pi
use graydata_flags, only : iequil,dst
use graydata_flags, only : dst
use graydata_par, only : sgnbphi
use graydata_anequil, only : b0,rr0m,rpam
use graydata_anequil, only : rr0m
implicit none
c local constants
integer, parameter :: jmx=31,kmx=36,nmx=8000
@ -5937,20 +5931,24 @@ c
. vcsi=>c_,qe=>ecgs_,me=>mecgs_,vc=>ccgs_,mc2=>mc2_
use green_func_p, only: SpitzFuncCoeff
use conical, only : fconic
use magsurf_data, only : ch,tjp,tlm,njpt,nlmt
use dierckx, only : profil
implicit none
c local constants
real(wp_), parameter :: mc2m2=1.0_wp_/mc2**2,
. canucc=2.0e13_wp_*pi*qe**4/(me**2*vc**3),ceff=qesi/(mesi*vcsi)
integer, parameter :: ksp=3
c arguments
integer ieccd,nhmn,nhmx,ithn,iokhawa,ierr
real(wp_) :: yg,anpl,anprre,amu,Zeff,rbn,rbx,
. fc,dens,psinv,effjcd
complex(wp_) :: ex,ey,ez
c local variables
integer nhn
integer nhn,njp,nlm,npar
real(wp_) :: anum,denom,resp,resj,coullog,anucc,alams,
. fp0s,pa,cst2
real(wp_), dimension(5) :: eccdpar
real(wp_) :: chlm(nlmt)
real(wp_), dimension(3+2*nlmt) :: eccdpar ! dimension(max(5,3+nlmt))
c
real(wp_), external :: fjch,fjncl,fjch0
c
@ -6009,10 +6007,18 @@ c rzfc=(1+Zeff)/fc
call SpitzFuncCoeff(amu,Zeff,fc)
eccdpar(2) = fc
eccdpar(3) = rbx
eccdpar(4) = psinv
njp=njpt
nlm=nlmt
call profil(0,tjp,njp,tlm,nlm,ch,ksp,ksp,sqrt(psinv),nlm,chlm,
. ierr)
if(ierr.gt.0) print*,' Hlambda profil =',ierr
npar=3+2*nlm
eccdpar(4:3+nlm) = tlm
eccdpar(4+nlm:npar) = chlm
do nhn=nhmn,nhmx
call curr_int(yg,anpl,anprre,amu,ex,ey,ez,nhn,ithn,cst2,
. fjncl,eccdpar,4,resj,resp,iokhawa,ierr)
. fjncl,eccdpar,npar,resj,resp,iokhawa,ierr)
anum=anum+resj
denom=denom+resp
end do
@ -6456,7 +6462,8 @@ c
c extrapar(16) = zeff
c extrapar(17) = fc
c extrapar(18) = hb
c extrapar(19) = psin
c extrapar(19:18+(npar-18)/2) = tlm
c extrapar(19+(npar-18)/2:npar) = chlm
c
use const_and_precisions, only : wp_
use green_func_p, only: GenSpitzFunc
@ -6466,8 +6473,9 @@ c arguments
real(wp_) :: upl,fjncl
real(wp_), dimension(npar) :: extrapar
c local variables
real(wp_) :: anpl,amu,ygn,zeff,fc,hb,psin,gam,u2,u,upr2,
real(wp_) :: anpl,amu,ygn,zeff,fc,hb,gam,u2,u,upr2,
. bth,uth,fk,dfk,alam,fu,dfu,eta,fpp
integer :: nlm
c
anpl=extrapar(2)
amu=extrapar(3)
@ -6475,7 +6483,6 @@ c
zeff=extrapar(16)
fc=extrapar(17)
hb=extrapar(18)
psin=extrapar(19)
gam=anpl*upl+ygn
u2=gam*gam-1.0_wp_
@ -6483,12 +6490,15 @@ c
upr2=u2-upl*upl
bth=sqrt(2.0_wp_/amu)
uth=u/bth
call GenSpitzFunc(amu,Zeff,fc,uth,u,gam,fk,dfk)
call GenSpitzFunc(Zeff,fc,uth,u,gam,fk,dfk)
fk=fk*(4.0_wp_/amu**2)
dfk=dfk*(2.0_wp_/amu)*bth
alam=upr2/u2/hb
call vlambda(alam,psin,fu,dfu)
nlm=(npar-18)/2
call vlambda(alam,extrapar(19),
. extrapar(19+nlm),
. nlm,fu,dfu)
eta=gam*fu*dfk/u-2.0_wp_*(anpl-gam*upl/u2)*fk*dfu*upl/u2/hb
if(upl.lt.0) eta=-eta
@ -6498,39 +6508,28 @@ c
c
c
c
subroutine vlambda(alam,psi,fv,dfv)
subroutine vlambda(alam,tlm,chlm,nlmt,fv,dfv)
use const_and_precisions, only : wp_
use magsurf_data, only : ch,ch01,tjp,tlm,njpt,nlmt,npsi
use dierckx, only : fpbisp
use dierckx, only : splev,splder
implicit none
c local constants
integer, parameter :: nlam=41,ksp=3,nlest=nlam+ksp+1
integer, parameter :: ksp=3
c arguments
real(wp_) alam,psi,fv,dfv
real(wp_) :: alam,fv,dfv
integer :: nlmt
real(wp_), dimension(nlmt) :: tlm,chlm
c local variables
integer :: njp,nlm,iwp,iwl,njest,lwrk,kwrk
integer, dimension(:), allocatable :: iwrk
real(wp_), dimension(1) :: xxs,yys,ffs
real(wp_), dimension(:), allocatable :: wrk
integer :: nlm,ier
real(wp_), dimension(nlmt) :: wrk
real(wp_), dimension(1) :: xxs,ffs
c
njest=npsi+ksp+1
kwrk=npsi+nlam+njest+nlest+3
lwrk=4*(npsi+nlam)+11*(njest+nlest)+njest*npsi+nlest+54
allocate(iwrk(kwrk),wrk(lwrk))
c
njp=njpt
nlm=nlmt
xxs(1)=sqrt(psi)
yys(1)=alam
xxs(1)=alam
c
call fpbisp(tjp,njp,tlm,nlm,ch,ksp,ksp,xxs,1,yys,1,ffs,
. wrk(1),wrk(5),iwrk(1),iwrk(2))
call splev(tlm,nlm,chlm,ksp,xxs(1),ffs(1),1,ier)
fv=ffs(1)
c
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))
call splder(tlm,nlm,chlm,ksp,1,xxs(1),ffs(1),1,wrk,ier)
dfv=ffs(1)
c
return
@ -6631,8 +6630,7 @@ c
subroutine pec(pabs,currt)
use const_and_precisions, only : wp_,pi,one
use numint, only : simpson
use graydata_flags, only : ipec,ieccd,iequil,nnd,dst
use graydata_anequil, only : rr0m,rpam
use graydata_flags, only : ipec,ieccd,nnd,dst
use utils, only : locatex, locate, intlin
implicit none
c local constants
@ -6986,7 +6984,7 @@ c
c
subroutine profwidth(nd,xx,yy,rhotmx,rhopmx,ypk,drhot,drhop)
use const_and_precisions, only : wp_,emn1
use graydata_flags, only : ipec,iequil
use graydata_flags, only : ipec
use utils, only : locatex, locate, intlin, vmaxmini
implicit none
c arguments

View File

@ -13,7 +13,7 @@
IMPLICIT NONE
CHARACTER(Len=1), PRIVATE :: adj_appr(6) ! adjoint approach switcher
!-------
REAL(wp_), PRIVATE :: r2,q2,gp1,Rfactor
REAL(wp_), PRIVATE :: r2,q2,gp1
!-------
REAL(wp_), PRIVATE, PARAMETER :: delta = 1e-4 ! border for recalculation
!------- for N.M. subroutines (variational principle) -------
@ -107,7 +107,7 @@
END SUBROUTINE Setup_SpitzFunc
SUBROUTINE GenSpitzFunc(mu,Zeff,fc,u,q,gam, K,dKdu)
SUBROUTINE GenSpitzFunc(Zeff,fc,u,q,gam, K,dKdu)
!=======================================================================
! Author: N.B.Marushchenko
! June 2005: as start point the subroutine of Ugo Gasparino (198?)
@ -162,7 +162,6 @@
! u - p/sqrt(2mT)
! q - p/mc;
! gam - relativistic factor;
! mu - mc2/Te
! Zeff - effective charge;
! fc - fraction of circulating particles.
!
@ -172,9 +171,9 @@
!=======================================================================
use const_and_precisions, only : comp_eps
IMPLICIT NONE
REAL(wp_), INTENT(in) :: mu,Zeff,fc,u,q,gam
REAL(wp_), INTENT(in) :: Zeff,fc,u,q,gam
REAL(wp_), INTENT(out) :: K,dKdu
REAL(wp_) :: gam1,gam2,gam3,w,dwdu
REAL(wp_) :: gam1,gam2,gam3
!=======================================================================
K = 0
dKdu = 0
@ -241,7 +240,6 @@
INTEGER :: n,i,j
REAL(wp_) :: rtc,rtc1,y,tn(1:nre)
REAL(wp_) :: m(0:4,0:4),g(0:4)
REAL(wp_) :: om(0:4,0:4)
REAL(wp_) :: gam11,gam21,gam31,gam41,gam01, &
gam22,gam32,gam42,gam02, &
gam33,gam43,gam03, &
@ -250,9 +248,9 @@
alp23,alp24,alp20, &
alp34,alp30,alp40
REAL(wp_) :: bet0,bet1,bet2,bet3,bet4,d0
LOGICAL :: renew,rel,newmu,newne,newZ,newfc
LOGICAL :: renew,rel,newmu,newZ,newfc
REAL(wp_), SAVE :: sfdx(1:4) = 0
REAL(wp_), SAVE :: ne_old =-1, mu_old =-1, Zeff_old =-1, fc_old =-1
REAL(wp_), SAVE :: mu_old =-1, Zeff_old =-1, fc_old =-1
!=======================================================================
rel = mu < mc2_
newmu = abs(mu -mu_old ) > delta*mu