(file) Return to physics.gaskell CVS log (file) (dir) Up to [HallC] / simc_semi

File: [HallC] / simc_semi / physics.gaskell (download)
Revision: 1.1.1.1 (vendor branch), Fri Apr 23 17:13:18 2004 UTC (20 years, 4 months ago) by gaskelld
Branch: hallc, MAIN
CVS Tags: start, baryon, NoPoltar, HEAD
Changes since 1.1: +0 -0 lines
simc_semi sources

!------------------------------------------------------------------------

	real*8 function peepi(ev,mev)

* Purpose:
* This routine calculates p(e,e'pi+)n cross sections from a fit to the data of
* Brauel et al., Z.Phys.C. 3(1979)101.
*
* variables:
*
*   input:
*	qmag		!3-momentum of virtual photon		(MeV/c)
*	omega		!energy of virtual photon		(MeV)
*	theta_pq	!angle between pi and q			(rad)
*	efinal_p	!energy of pion				(MeV/c)
*	Q2_g            !4-momentum of virtual photon, squared  (GeV/c)^2
*	e0_i		!incident electron beam energy		(MeV)
*	pf_e_i		!momentum of scattered electron		(MeV/c)
*	epsilon		!epsilon				(dimensionless)
*	phi_x		!angle between hadron & electron planes	(rad)
*	eject_mass	!mass of the pion			(MeV/c^2)
*
*   output:
*	sigma_eepi	!d3sigma/dEe'dOmegae'Omegapi	(microbarn/GeV/sr^2)

	implicit none
	include 'simulate.inc'

	record /event_main/ mev
	record /event/	ev

* NOTE: when we refer to the center of mass system, it always refers to the
* photon-NUCLEON center of mass, not the photon-NUCLEUS!  The model gives
* the cross section in the photon-nucleon center of mass frame.

	real*8 sigma_eepi		!final cross section (returned as peepi)
	real*8 mrho
	real*8 fpi,fpi2			!pion form factor (squared).
	real*8 sig219,sig,factor
	real*8 sigt,sigl,siglt,sigtt	!components of dsigma/dt
	real*8 s5lab			!dsigma/dE_e/dOmega_e/dOmega_pi (in some lab)
	real*8 mtar,mrec,efer		!mass (energy) of target/recoil particle
	real*8 epsi			!epsilon of virtual photon
	real*8 gtpr			!gamma_t prime.
	real*8 tcos,tsin		!cos/sin of theta between ppi and q
	real*8 tfcos,tfsin		!cos/sin of theta between pfermi and q
	real*8 bstar,bstarx,bstary,bstarz,gstar	!beta/gamma of C.M. system in lab
	real*8 ppix,ppiy,ppiz,ppidummy		!pion momentum in lab.
	real*8 thetacm,phicm			!C.M. scattering angles
	real*8 costcm,costo2cm
	real*8 sintcm,sinto2cm
	real*8 ppicm,ppicmx,ppicmy,ppicmz,epicm	 !pion E,p in C.M.
	real*8 pstar,pstarx,pstary,pstarz,estar	 !c.m. pion   momentum/energy
	real*8 qstar,qstarx,qstary,qstarz,nustar !c.m. photon momentum/energy
	real*8 pfx,pfy,pfz			 !p_fermi x,y,z components.
	real*8 qx,qy,qz
	real*8 zero

	real*8 efinal_e,efinal_p		!total energy for final state pion/elec.
	real*8 s,t,Q2_g				!t,s, Q2 in (GeV/c)**2
	real*8 nu				!equivilent photon energy (MeV)

	real*8 root_two,mpi_to_microbarn
	real*8 CLEB(2,3),qfm,Q2_table(8),nu_table(10),atemp(42)
	real*8 Q2_high,Q2_low,deltaQ2,nu_high,nu_low,delta_nu,F
	real*8 new_x_x,new_x_y,new_x_z
	real*8 new_y_x,new_y_y,new_y_z
	real*8 new_z_x,new_z_y,new_z_z
	real*8 dummy,p_new_x,p_new_y,phiqn
	real*8 adphi,bdphi,dphidphi
	real*8 davesig,phipq
	real*8 square_root,dp_dcos_num,dp_dcos_den,dp_dcos
	real*8 dp_dphi_num,dp_dphi_den,dp_dphi
	real*8 dt_dcos_lab,dt_dphi_lab,psign,dpdphi
	real*8 dpxdphi,dpydphi,dpxdcos,dpydcos,dpzdcos,dpzdphi
	real*8 dpxnewdphi,dpynewdphi,dpxnewdcos,dpynewdcos
	real*8 dpznewdphi,dpznewdcos
	real*8 dphicmdphi,dphicmdcos
	real*8 jacobian

	real*8 pbeam,beam_newx,beam_newy,beam_newz
	real*8 pbeamcmx,pbeamcmy,pbeamcmz,ebeamcm,pbeamcm
	real*8 ppicm_newx,ppicm_newy,ppicm_newz

	real*8 davesig2,jacobian2,dpzcmdphi
	real*8 dEcmdcos,dEcmdphi,dcoscmdcos,dcoscmdphi
	real*8 theta_temp

	complex*8 H1,H2,H3,H4,H5,H6         !Helicity amplitudes
	complex*8 amplitude(7),A1,A2,A3,A4,A12,A34,A1234
	complex*8 AT(7,3,8,10)
	complex*8 gf1,gf2,gf3,gf4,gf7,gf8
	complex*8 hnperp,hfperp,hnpar,hfpar,hnlong,hflong
	complex*8 XL,XT,XTT,XLT

	integer Q2_count,nu_count,multipole,IT1,IT2,IT3,IT4,IT5
	integer final_state,isospin

	logical first,low_w_flag

	data first /.TRUE./
	data low_w_flag /.FALSE./   !Assume high W kinematics to start

* Initialize some stuff.
	Q2_g = ev.Q2/1000000.
	phipq = mev.oop_angle
	mtar=Mp
	mrec=Mp
	if (doing_peepi) then
	  if(doing_piplus) then
	    mtar=Mp
	    mrec=Mn
	    final_state = 1
	  else
	    mtar=Mn
	    mrec=Mp
	    final_state = 2
	  endif
	endif

* calculate energy of initial (struck) nucleon, using the same assumptions that
* go into calculating the pion angle/momentum (in event.f).  For A>1, the struck
* nucleon is off shell, the 2nd nucleon (always a neutron) is on shell, and has
* p = -p_fermi, and any additional nucleons are at rest.

	efer = sqrt(pfer**2+mtar**2)
	if(doing_deutpi.or.doing_hepi) then
	 efer = target.M-sqrt(mn**2+pfer**2)
	 if(doing_hepi)efer=efer-mp
c	 mtar = sqrt(efer**2-pfer**2)
	endif


* calculate some kinematical variables
* f's and fer indicate fermi momenta, s, star or cm CM system

	tcos = ev.up.x*ev.uq.x+ev.up.y*ev.uq.y+ev.up.z*ev.uq.z
	if(tcos-1..gt.0..and.tcos-1..lt.1.E-8)tcos=1.0
	tsin=sqrt(1.-tcos**2)

	tfcos = pferx*ev.uq.x+pfery*ev.uq.y+pferz*ev.uq.z
	if(tfcos-1..gt.0..and.tfcos-1..lt.1.E-8)tfcos=1.0
	tfsin=sqrt(1.-tfcos**2)

	epsi = 1./(1.+2*(1.+ev.omega**2/ev.Q2)*tan(ev.e.th/2.)**2)

c	s = (ev.omega+sqrt(pfer**2+mtar**2))**2
c     &      -(ev.q+pfer*tfcos)**2-(pfer*tfsin)**2
	s = (ev.omega+efer)**2-(ev.q+pfer*tfcos)**2-(pfer*tfsin)**2
	nu = (s-(efer**2-pfer**2))/2./(efer-pfer*tfcos) !equiv pho energy(MeV)
	if((nu.lt.500.).and.(first))then
	   write(6,*) 'nu is less than 500 Mev!!',nu
	   write(6,*) 'Using low W multipole model...'
	   low_w_flag = .TRUE.
	endif
	s = s/1.e6				!CONVERT TO (GeV)**2
	mev.w = sqrt(s)

	efinal_e = sqrt(ev.e.P**2 + Me2)
	efinal_p = sqrt(ev.p.P**2 + Mh2)

c	t = (ev.q-ev.p.P*tcos)**2 + (ev.p.P*tsin)**2-(ev.omega-efinal_p)**2
	t = ev.Q2-Mh2+2.*ev.omega*efinal_p-2.*ev.p.P*ev.q*tcos
	t = t/1.e6				!CONVERT TO (GeV/c)**2
	mev.t = t

* Calculate velocity of PHOTON-NUCLEON C.M. system in the lab frame. Use beta
* and gamma of the cm system (bstar and gstar) to transform particles into
* c.m. frame.  Define z along the direction of q, and x to be along the
* direction of the pion momentum perpendicular to q.

* DJG: Get pfer components in the lab "q" system
        dummy=sqrt((ev.uq.x**2+ev.uq.y**2)*(ev.uq.x**2+ev.uq.y**2+ev.uq.z**2))
        new_x_x = -(-ev.uq.x)*ev.uq.z/dummy
        new_x_y = -(-ev.uq.y)*ev.uq.z/dummy
        new_x_z = ((-ev.uq.x)**2 + (-ev.uq.y)**2)/dummy

        dummy   = sqrt(ev.uq.x**2 + ev.uq.y**2)
        new_y_x =  (-ev.uq.y)/dummy
        new_y_y = -(-ev.uq.x)/dummy
        new_y_z =  0.0

        p_new_x = pfer*((-pferx)*new_x_x + (-pfery)*new_x_y + pferz*new_x_z)
        p_new_y = pfer*((-pferx)*new_y_x + (-pfery)*new_y_y + pferz*new_y_z)

        if(p_new_x.eq.0.)then
           phiqn=0.
        else
           phiqn = atan2(p_new_y,p_new_x)
        endif
        if(phiqn.lt.0.)phiqn = phiqn+2.*pi

* get beam in "q" system.

	pbeam = sqrt(ev.Ein**2-me**2)
	beam_newx = pbeam*new_x_z
	beam_newy = pbeam*new_y_z
	beam_newz = pbeam*ev.uq.z

	bstar=sqrt((ev.q+pfer*tfcos)**2+(pfer*tfsin)**2)/(efer+ev.omega)
	gstar=1./sqrt(1. - bstar**2)

	bstarz = (ev.q+pfer*tfcos)/(efer+ev.omega)
	bstarx = p_new_x/(efer+ev.omega)
	bstary = p_new_y/(efer+ev.omega)
	
* DJG: Boost virtual photon to CM.

	zero =0.d0
	call loren_real8(gstar,bstarx,bstary,bstarz,ev.omega,
     &              zero,zero,ev.q,nustar,qstarx,qstary,qstarz,qstar)

* DJG: Boost pion to CM.
	
	ppiz = ev.p.P*tcos
	ppix = ev.p.P*tsin*cos(phipq)
	ppiy = ev.p.P*tsin*sin(phipq)
	call loren_real8(gstar,bstarx,bstary,bstarz,ev.p.E,
     &		ppix,ppiy,ppiz,epicm,ppicmx,ppicmy,ppicmz,ppicm)
	thetacm = acos((ppicmx*qstarx+ppicmy*qstary+ppicmz*qstarz)/ppicm/qstar)

* DJG Boost the beam to CM.

	call loren_real8(gstar,bstarx,bstary,bstarz,ev.Ein,beam_newx,
     &		beam_newy,beam_newz,ebeamcm,pbeamcmx,pbeamcmy,pbeamcmz,pbeamcm)

* Thetacm is defined as angle between ppicm and qstar.
* To get phicm, we need out of plane angle relative to scattering plane
* (plane defined by pbeamcm and qcm).  For stationary target, this plane 
* does not change.  In general, the new coordinate system is defined such 
* that the new y direction is given by (qcm x pbeamcm) and the new x 
* is given by (qcm x pbeamcm) x qcm.
 
	dummy = sqrt((qstary*pbeamcmz-qstarz*pbeamcmy)**2+
     &          (qstarz*pbeamcmx-qstarx*pbeamcmz)**2
     &         +(qstarx*pbeamcmy-qstary*pbeamcmx)**2)
	new_y_x = (qstary*pbeamcmz-qstarz*pbeamcmy)/dummy
	new_y_y = (qstarz*pbeamcmx-qstarx*pbeamcmz)/dummy
	new_y_z = (qstarx*pbeamcmy-qstary*pbeamcmx)/dummy

	dummy = sqrt((new_y_y*qstarz-new_y_z*qstary)**2
     &         +(new_y_z*qstarx-new_y_x*qstarz)**2
     &         +(new_y_x*qstary-new_y_y*qstarx)**2)
	new_x_x = (new_y_y*qstarz-new_y_z*qstary)/dummy
	new_x_y = (new_y_z*qstarx-new_y_x*qstarz)/dummy
	new_x_z = (new_y_x*qstary-new_y_y*qstarx)/dummy

	new_z_x = qstarx/qstar
	new_z_y = qstary/qstar
	new_z_z = qstarz/qstar

        ppicm_newx = ppicmx*new_x_x + ppicmy*new_x_y + ppicmz*new_x_z
        ppicm_newy = ppicmx*new_y_x + ppicmy*new_y_y + ppicmz*new_y_z
	ppicm_newz = ppicmx*new_z_x + ppicmy*new_z_y + ppicmz*new_z_z

	sintcm = sin(thetacm)
	costcm = cos(thetacm)
	sinto2cm = sin(thetacm/2.)
	costo2cm = cos(thetacm/2.)
	phicm = atan2(ppicm_newy,ppicm_newx)
	if(phicm.lt.0.) phicm = 2.*3.141592654+phicm

	mev.thetacm = thetacm
	mev.phicm = phicm

*******************************************************************************
	if((nu.ge.500.0).and.(low_w_flag)) then
	    WRITE(6,*) 'LOOK OUT CHEESY POOF BREATH!'
	    WRITE(6,*) 'W IS TOO HIGH FOR THIS MODEL'
	    WRITE(6,*) 'SETTING NU to 499.9'
	    nu=499.9
	endif

	if(low_w_flag) then     !Use multipole expansion for low W.

* DJG Initialize CG Coefficients for low W model.
*       Clebsch-Gordon Coefficients  CLEB(FINAL STATE, ISOSPIN)
*                                         1: PI+ N--------1(IS.1/2)
*                                         2: PI- P--------2(IV.1/2)
*                                                 --------3(IV.3/2)
         root_two = sqrt(2.)
	 mpi_to_microbarn = 197.327/mh
         CLEB(1,1)=root_two
         CLEB(1,2)=root_two/3.
         CLEB(1,3)=-root_two/3.
	
         CLEB(2,1)=root_two
         CLEB(2,2)=-root_two/3.
         CLEB(2,3)=root_two/3.

* DJG Read in multipoles for low W model.

	 if(first) then
	  first = .FALSE.
	  write(6,*) 'READING IN MULTIPOLES...'
	  OPEN(3,FILE='MULTIPOL.file',STATUS='OLD')
          do Q2_count = 1,8
	     read(3,202) qfm                           !q**2 in fm**2
	     Q2_table(Q2_count) = qfm*0.0389379        !convert to GeV**2
             do nu_count=1,10
               read(3,203)nu_table(nu_count)
               read(3,204)atemp		!multipolarity amplitudes, see,eg,table below
               do multipole=1,7
                 IT1=multipole+7
                 IT2=multipole+14
                 IT3=multipole+21
                 IT4=multipole+28
                 IT5=multipole+35

C      Multipoles in units of  10**-2 MPI+**-1
C  Multipole Amplitude Table: AT(TYPE    ,  ISOSPIN ,-Q**2 , P.EQ.PH.R.)
C                                 1:-----E0+-------0(IS.1/2)
C                                 2:-----M1--------1(IV.1/2)
C                                 3:-----E1+-------3(IV.3/2)
C                                 4:-----M1+
C                                 5:-----S0+
C                                 6:-----S1-
C                                 7:-----S1+
                 AT(multipole,3,Q2_count,nu_count)=
     &                                       CMPLX(ATEMP(multipole),ATEMP(IT1))
                 AT(multipole,2,Q2_count,nu_count)=CMPLX(ATEMP(IT2),ATEMP(IT3))
                 AT(multipole,1,Q2_count,nu_count)=CMPLX(ATEMP(IT4),ATEMP(IT5))
               enddo	!multipole
             enddo	!nu
          enddo		!Q2
	  close(unit=3)
	 endif		!if first time.

* Interpolate multipole amplitudes from table.
	 do Q2_count=1,8
	    Q2_high=0.
	    Q2_low=0.
	    nu_high=0.
	    nu_low=0.
	    if((Q2_g.gt.Q2_table(Q2_count)).and.
     &                      (Q2_g.lt.Q2_table(Q2_count+1))) then
	      Q2_high = Q2_table(Q2_count+1)
	      Q2_low = Q2_table(Q2_count)
	      deltaQ2 = (Q2_high-Q2_low)
	      do nu_count=1,10
	       if((nu.gt.nu_table(nu_count)).and.
     &            (nu.lt.nu_table(nu_count+1))) then
	         nu_high = nu_table(nu_count+1)
	         nu_low =  nu_table(nu_count)
	         delta_nu = nu_high-nu_low
		 do multipole=1,7
		   amplitude(multipole) = 0.
		   do isospin = 1,3
		      A1 = AT(multipole,isospin,Q2_count,nu_count)
		      A2 = AT(multipole,isospin,Q2_count+1,nu_count)
		      A3 = AT(multipole,isospin,Q2_count,nu_count+1)
		      A4 = AT(multipole,isospin,Q2_count+1,nu_count+1)
		      A12= (A1*(Q2_high-Q2_g) + A2*(Q2_g-Q2_low))/deltaQ2
		      A34= (A3*(Q2_high-Q2_g) + A4*(Q2_g-Q2_low))/deltaQ2
		      A1234 = (A12*(nu_high-nu)+A34*(nu-nu_low))/delta_nu
		      amplitude(multipole) = amplitude(multipole) + 
     &                                    CLEB(final_state,isospin)*A1234
		   enddo
*                                        !Convert multipoles to microb^.5
		   amplitude(multipole) = mpi_to_microbarn*amplitude(multipole)
	         enddo
	       endif	!nu check
	      enddo	!nu
	    endif	!Q2 check
	 enddo		!Q2

* Now calculate the Helicity amplitudes

	 gf1 = amplitude(1) + 3.*costcm*(amplitude(4)+amplitude(3))
	 gf2 = 2.*amplitude(4) + amplitude(2)
	 gf3 = 3.*(amplitude(3)-amplitude(4))
	 gf4 = (0.,0.)
	 gf7 = amplitude(6) - 2.*amplitude(7)
	 gf8 = amplitude(5) + 6.*costcm*amplitude(7)

* DJG WALKER helicity amplitudes
	 H5 = -costo2cm*(gf7+gf8)
	 H6 = -sinto2cm*(gf7-gf8)
	 H4 = (2.*sinto2cm*(gf1+gf2)+costo2cm*sintcm*(gf3+gf4))/root_two
	 H2 = (-2.*costo2cm*(gf1-gf2)+sinto2cm*sintcm*(gf3-gf4))/root_two
	 H1 = (-costo2cm*sintcm*(gf3+gf4))/root_two
	 H3 = (-sinto2cm*sintcm*(gf3-gf4))/root_two

* DJG Bartl helicity amplitudes
* key:          hnperp -----> photon pol. perp. to scatt. plane,no baryon flip
*               hfpar -----> photon pol. par. to scatt. plane, baryon flip
*               hnlong -----> longitudinal photon pol., no baryon flip
*               hflong -----> longitudinal photon pol., baryon flip
*               hnpar -----> photon pol. par. to scatt. plane, no baryon flip
*               hfperp -----> photon pol. perp. to scatt. plane, baryon flip

	 hnperp = (H4+H1)/root_two
	 hfpar = (H3+H2)/root_two
	 hnlong = H5
	 hflong = H6
	 hnpar = (H4-H1)/root_two
	 hfperp = (H3-H2)/root_two

	 XT = hnperp*CONJG(hnperp)+hfpar*CONJG(hfpar)+hnpar*CONJG(hnpar)+
     &       hfperp*CONJG(hfperp)
	 XL = hnlong*CONJG(hnlong) + hflong*CONJG(hflong)
	 XTT = hnpar*CONJG(hnpar)+hfperp*CONJG(hfperp)-hnperp*CONJG(hnperp)-
     &        hfpar*CONJG(hfpar)
	 XLT = hnlong*CONJG(hnpar)+hflong*CONJG(hfpar)

	 F = 2.*((efer-pfer*tfcos)/1000.)*sqrt(s)*(ppicm/1000.)/
     &      (s-(mtar/1000.)**2)/(mtar/1000.)
	 write(6,*) 'EFER..',efer,pfer,sqrt(efer**2-pfer**2)

	 sigt = F/2.*XT
	 sigl = F*XL
	 sigtt = F/2.*XTT
	 siglt = 2.*F*REAL(XLT)
	 siglt=siglt/2.           !Divide siglt by 2 because Henk uses
                                  !a different convention when adding
                                  !the four terms together. DJG

	 sig219=(sigt+epsi*sigl+epsi*cos(2.*phicm)*sigtt
     &		+sqrt(2.0*epsi*(1.+epsi))*cos(phicm)*siglt)/1.d0

* DJG: This is dsig/dOmega_cm - convert to dsig/dtdphi_cm
* DJG: using dt/dcos_cm = 2ppicmqcm

 	 sig = sig219/ppicm/qstar/2.

	else                 !If equivalent gamma energy too high
	                     !use Henk Blok's fit to Brauel data

* Fits to p(e,e'pi+)n cross-sections
* HPB: cross sections for pi-fits to Brauel's n(e,e'pi-)p
* HPB: dsigma/dt cross sections at W=2.19 and Q^2=0.70 MODIFIED BY HAND!!!

	 sigl = 27.8*exp(-11.5*abs(t))
	 sigt = 10.0*(5.*abs(t))*exp(-5.*abs(t))
	 siglt= 0.0*sin(thetacm)
 	 sigtt= -(4.0*sigl+0.5*sigt)*(sin(thetacm))**2

cDJG	 if (.not.doing_piplus) then
cDJG	   sigt =sigt *0.25*(1.+3.*exp(-10.*abs(t)))
cDJG	   sigtt=sigtt*0.25*(1.+3.*exp(-10.*abs(t)))
cDJG	 endif

* GMH: Now scale sigl by Q2*pion_formfactor
* HPB: parametrization of pion formfactor in the region 0.5<Q2<1.8

	 mrho = 0.712   !DETERMINED BY EMPIRICAL FIT TO FORMFACTOR (GeV/c**2)

 	 fpi=1./(1.+1.65*Q2_g+0.5*Q2_g**2)
	 fpi2=fpi**2

* HPB: now convert to different Q^2
* HPB: s_L follows Q^2*Fpi^2; s_T and s_TT go as 1/(0.3+Q^2)?
* HPB: factor 0.1215 therefore is value of q2*fpi**2 for q2=0.7

	 sigl=sigl*(fpi2*Q2_g)/0.1215
	 sigt=sigt/(0.3+Q2_g)
	 sigtt=sigtt/(0.3+Q2_g)

	 sig219=(sigt+epsi*sigl+epsi*cos(2.*phicm)*sigtt
     &		+sqrt(2.0*epsi*(1.+epsi))*cos(phicm)*siglt)/1.d0

* GMH: Brauel scaled all his data to W=2.19 GeV,so rescale by 1/(W**2-mp**2)**2
* HPB: factor 15.333 therefore is value of (W**2-mp**2)**2 at W=2.19

	 sig=sig219*15.333/(s-(mtar/1000.)**2)**2
	 sig=sig/2./pi/1e+06   !dsig/dtdphicm in microbarns/MeV**2/rad

        endif        !end test on high or low W

*******************************************************************************
* GMH: Virtual photon to electron beam flux conversion factor
* DJG: Replace mtar in denominator of gammaflux with more general
* DJG: efer-pfer*tfcos, for pfer =0 this reverts to old form
c	gtpr = alpha/2./(pi**2)*efinal_e/ev.Ein*(s-(mtar/1000.)**2)/2./
c     &          (mtar/1000.)/Q2_g/(1.-epsi)

	gtpr = alpha/2./(pi**2)*efinal_e/ev.Ein*(s-(mtar/1000.)**2)/2./
     &		((efer-pfer*tfcos)/1000.)/Q2_g/(1.-epsi)

* GH: Now determine momentum of pion in n-pi cm frame, needed to properly add
* GH: together the components of the cross-section

* Now, Henk's CM -> LAB transformation
* HPB: Brauel's cross section is expressed in an invariant way as dsigma/dtdphi,
* HPB: with a virtual photon flux factor based on a full cross section, written
* HPB: as: dsigma/dQ2dWdtdphi. One can convert this cross section to dsigma/domega  
* HPB: in the lab frame or the cm frame by multiplying with the factor q*p_pi/3.14
* HPB: (with the variables in the lab frame, or the cm frame)
* HPB: this factor is built from dt/dcos(theta)=2pq, and a factor 1/2pi, which
* HPB: comes from the conversion of Brauel's virtual photon flux factor and the
* HPB: one we use, based on dsigma/dE_e'dOmega_e'dOmega_pi
* HPB: see Devenish and Lyth, Phys. Rev.  C D5, 47(1972)

* Simpler (I hope) explanation:  sig is d2sigma/dt/dphi_cm.  In order to get
* d2sigma/domega_cm (=s2cm), we multiply by dt/domega_cm = 1/2/pi*dt/dcos(theta_cm)
* = 1/pi*q_cm*p_cm.  We can then get d5sigma/dE_e'/dOmega_e'/dOmega_pi_cm by
* multiplying by gammav.  Either of these can be converted to the dOmega_lab
* by multiplying by dOmega_lab/dOmega_cm = dcos(theta_lab)/dcos(theta_cm)
* (dphi_cm/dphi_lab=1 since the frames are collinear).  This is 'factor',
* which is equal to dt/dcos(theta_cm) / dt/dcos(theta_lab).  Hence, the
* following cross sections can be calculated:
*       s2cm =       sig*qcm*ppicm       /pi
*       s5cm =gammav*sig*qcm*ppicm       /pi
*       s2lab=       sig*q  *ppi  *factor/pi
*       s5lab=gammav*sig*q  *ppi  *factor/pi

c	factor = mtar/(mtar+ev.omega-ev.q*ev.p.E/ev.p.P*tcos)
c	s5lab = gtpr*sig*ev.q*ev.p.P*factor/pi/1.e+06

* DJG The above assumes target at rest.  We need a full blown Jacobian: 
* DJG | dt/dcos(theta) dphicm/dphi - dt/dphi dphicm/dcos(theta) |
* DJG: Calculate dt/d(cos(theta)) and dt/dphi for the general case.

	psign = cos(phiqn)*cos(phipq)+sin(phiqn)*sin(phipq)

	square_root = ev.q + pfer*tfcos - ev.p.P*tcos
	dp_dcos_num = ev.p.P + (ev.p.P**2*tcos - 
     &		psign*pfer*ev.p.P*tfsin*tcos/tsin)/square_root
	dp_dcos_den = ( (ev.omega+efer-ev.p.E)*ev.p.P/ev.p.E + 
     &		ev.p.P*tsin**2-psign*pfer*tfsin*tsin )/square_root - tcos
	dp_dcos = dp_dcos_num/dp_dcos_den

	dp_dphi_num = pfer*ev.p.P*tsin*tfsin*(cos(phiqn)*sin(phipq)-
     &          sin(phiqn)*cos(phipq))/square_root
	dp_dphi_den = tcos + (pfer*tsin*tfsin*psign - ev.p.P*tsin**2
     &          - (ev.omega+efer-ev.p.E)*ev.p.P/ev.p.E)/square_root
 	dp_dphi = dp_dphi_num/dp_dphi_den

	dt_dcos_lab = 2.*(ev.q*ev.p.P + 
     &		(ev.q*tcos-ev.omega*ev.p.P/ev.p.E)*dp_dcos)

	dt_dphi_lab = 2.*(ev.q*tcos-ev.omega*ev.p.P/ev.p.E)*dp_dphi

* DJG: Now calculate dphicm/dphi and dphicm/d(cos(theta)) in the most 
* DJG: excruciating way possible.

	dpxdphi = ev.p.P*tsin*(-sin(phipq)+(gstar-1.)*bstarx/bstar**2*
     &          (bstary*cos(phipq)-bstarx*sin(phipq)) ) +
     &          ( (ppicmx+gstar*bstarx*ev.p.E)/ev.p.P - 
     &              gstar*bstarx*ev.p.P/ev.p.E)*dp_dphi
	dpydphi = ev.p.P*tsin*(cos(phipq)+(gstar-1.)*bstary/bstar**2*
     &          (bstary*cos(phipq)-bstarx*sin(phipq)) ) +
     &          ( (ppicmy+gstar*bstary*ev.p.E)/ev.p.P - 
     &              gstar*bstary*ev.p.P/ev.p.E)*dp_dphi
	dpzdphi =  ev.p.P*(gstar-1.)/bstar**2*bstarz*tsin*
     &            (bstary*cos(phipq)-bstarx*sin(phipq)) +
     &          ((ppicmz+gstar*bstarz*ev.p.E)/ev.p.P-
     &            gstar*bstarz*ev.p.P/ev.p.E)*dp_dphi

	dpxdcos = -ev.p.P*tcos/tsin*(cos(phipq)+(gstar-1.)*bstarx/bstar**2*
     &          (bstarx*cos(phipq)+bstary*sin(phipq)-bstarz*tsin/tcos)) +
     &          ( (ppicmx+gstar*bstarx*ev.p.E)/ev.p.P - 
     &              gstar*bstarx*ev.p.P/ev.p.E)*dp_dcos
	dpydcos = -ev.p.P*tcos/tsin*(sin(phipq)+(gstar-1.)*bstary/bstar**2*
     &          (bstarx*cos(phipq)+bstary*sin(phipq)-bstarz*tsin/tcos)) +
     &          ( (ppicmy+gstar*bstary*ev.p.E)/ev.p.P - 
     &              gstar*bstary*ev.p.P/ev.p.E)*dp_dcos
	dpzdcos = ev.p.P*(1.-(gstar-1.)/bstar**2*bstarz*tcos/tsin*
     &              (bstarx*cos(phipq)+bstary*sin(phipq)-tsin/tcos*bstarz))
     &              +((ppicmz+gstar*bstarz*ev.p.E)/ev.p.P-gstar*bstarz*
     &              ev.p.P/ev.p.E)*dp_dcos

	dpxnewdphi = dpxdphi*new_x_x+dpydphi*new_x_y+dpzdphi*new_x_z
	dpynewdphi = dpxdphi*new_y_x+dpydphi*new_y_y+dpzdphi*new_y_z
	dpznewdphi = dpxdphi*new_z_x+dpydphi*new_z_y+dpzdphi*new_z_z

	dphicmdphi = (dpynewdphi*ppicm_newx - ppicm_newy*dpxnewdphi)/
     &                (ppicm_newx**2+ppicm_newy**2)

	dpxnewdcos = dpxdcos*new_x_x+dpydcos*new_x_y+dpzdcos*new_x_z
	dpynewdcos = dpxdcos*new_y_x+dpydcos*new_y_y+dpzdcos*new_y_z
	dpznewdcos = dpxdcos*new_z_x+dpydcos*new_z_y+dpzdcos*new_z_z

	dphicmdcos = (dpynewdcos*ppicm_newx - ppicm_newy*dpxnewdcos)
     &                /(ppicm_newx**2+ppicm_newy**2)

	dcoscmdcos = dpznewdcos/ppicm-ppicm_newz*epicm*dEcmdcos/ppicm**1.5
	dcoscmdphi = dpznewdphi/ppicm-ppicm_newz*epicm*dEcmdphi/ppicm**1.5

	jacobian = abs(dt_dcos_lab*dphicmdphi-dt_dphi_lab*dphicmdcos)
	mev.davejac = jacobian

	mev.johnjac = 2*(efer-2*pferz*pfer*ev.p.E/ev.p.P*tcos)*
     &		(ev.q+pferz*pfer)*ev.p.P /
     &		( efer+ev.omega-(ev.q+pferz*pfer)*ev.p.E/ev.p.P*tcos )
     &		- 2*ev.p.P*pfer

	davesig = gtpr*sig*jacobian
	sigma_eepi = davesig

	peepi = sigma_eepi
	decdist(21) = peepi	!d5sig
	decdist(22) = sig	!sig_cm

202	format(/11X,f5.1/)
203	format(11X,f5.0)
204	format(6(/9X,7f8.3))

	return
	end
!------------------------------------------------------------------------

	real*8 function sigep(ev)

	implicit none
	include 'simulate.inc'

	real*8	q4sq,qmu4mp,W1p,W2p,Wp,GE,GM,sigMott
	record /event/	ev

	q4sq	= ev.Q2
	call fofa_best_fit(-q4sq/hc**2,GE,GM)
	qmu4mp	= q4sq/4./Mp2
	W1p = GM**2*qmu4mp
	W2p = (GE**2+GM**2*qmu4mp)/(1.0+qmu4mp)
	Wp = W2p + 2.*W1p*tan(ev.e.th_phys/2.)**2
	sigep = sigMott(ev) * ev.e.E/ev.Ein * Wp
	if(debug_flag(5).eq.1)write(6,*) 'sigMott',GE,GM
	sigep=sigep*10000.	!  convert from fm^2 to ub

	return
	end

!-------------------------------------------------------------------------

	real*8 function deForest(ev)

	implicit none
	include 'simulate.inc'

	record /event/	ev

	real*8	q4sq,ebar,qbsq,GE,GM,f1,kf2,qmu4mp,sigMott,sin_gamma,cos_phi
	real*8	pbarp,pbarq,pq,qbarq,q2,f1sq,kf2_over_2m_allsq
	real*8	sumFF1,sumFF2,termC,termT,termS,termI,WC,WT,WS,WI,allsum

! Compute deForest sigcc cross-section, according to value of DEFOREST_FLAG:
!	Flag = 0    -- use sigcc1
!	Flag = 1    -- use sigcc2
!	Flag = -1   -- use sigcc1 ONSHELL, replacing Ebar with E = E'-omega
!			and qbar with q (4-vector)
! N.B.	Beware of deForest's metric when taking all those 4-vector inner
!	products in sigcc2 ... it is (-1,1,1,1)!
!	Here, I've defined all the inner products with the regular signs,
!	and then put them in the structure function
!	formulas with reversed signs compared to deForest.

	q4sq = -ev.Q2
	q2 = ev.q**2
	if (deForest_flag.ge.0) then
	  ebar = sqrt(ev.Pm**2 + Mh2)
	  qbsq = (ev.p.E-ebar)**2 - q2
	else
	  ebar = ev.p.E - ev.omega
	  qbsq = q4sq
	endif

	sin_gamma = 1. - (ev.uq.x*ev.up.x+ev.uq.y*ev.up.y+ev.uq.z*ev.up.z)**2
	if (sin_gamma.lt.0) then
	  write(6,'(1x,''WARNING: deForest came up with sin_gamma = '',f10.3,'' at event '',i10)') sin_gamma, nevent
	  sin_gamma = 0.0
	endif
	sin_gamma = sqrt(sin_gamma)
	cos_phi = 0.0
	if (sin_gamma.ne.0) cos_phi =
	1	(ev.uq.y*(ev.uq.y*ev.up.z-ev.uq.z*ev.up.y) -
	1	ev.uq.x*(ev.uq.z*ev.up.x-ev.uq.x*ev.up.z))
	1	/ sin_gamma / sqrt(1.-ev.uq.z**2)
	if (abs(cos_phi).gt.1.) then
	  write(6,'(1x,''WARNING: deForest came up with cos_phi = '',f10.3,'' at event '',i10)') cos_phi, nevent
	  cos_phi = sign(dble(1.),cos_phi)
	endif

	call fofa_best_fit(q4sq/hc**2,GE,GM)
	qmu4mp = q4sq/4./Mp2
	f1 = (GE-GM*qmu4mp)/(1.0-qmu4mp)
	kf2 = (GM-GE)/(1.0-qmu4mp)
	f1sq = f1**2
	kf2_over_2m_allsq = kF2**2/4./Mh2

	termC = (q4sq/q2)**2
	termT = (tan(ev.e.th_phys/2.))**2 - q4sq/2./q2
	termS = tan(ev.e.th_phys/2.)**2 - (q4sq/q2)*cos_phi**2
	termI = (-q4sq/q2)*sqrt(tan(ev.e.th_phys/2.)**2-q4sq/q2)*cos_phi

	if (deForest_flag.le.0) then
	  sumFF1 = (f1 + kf2)**2
	  sumFF2 = f1sq - qbsq*kf2*kf2/4./Mh2

	  WC = ((ebar+ev.p.E)**2)*sumFF2 - q2*sumFF1
	  WT = -2*qbsq*sumFF1
	  WS = 4*(ev.p.P**2)*(sin_gamma**2)*sumFF2
	  WI = -4*(ebar+ev.p.E)*ev.p.P*sin_gamma*sumFF2
	else
	  pbarp = ebar*ev.p.E - ev.p.p * (ev.up.x*ev.Pmx + ev.up.y*ev.Pmy +
	1	ev.up.z*ev.Pmz)
	  pbarq = ebar*ev.omega - ev.q*(ev.uq.x*ev.Pmx + ev.uq.y*ev.Pmy +
	1	ev.uq.z*ev.Pmz)
	  pq = ev.p.E*ev.omega - ev.p.p * ev.q * (ev.up.x*ev.uq.x +
	1	ev.up.y*ev.uq.y + ev.up.z*ev.uq.z)
	  qbarq = (ev.p.E-ebar)*ev.omega - q2

	  WC =	(ebar*ev.p.E+(-pbarp+Mh2)/2.) * f1sq - q2*f1*kf2/2.
	1	- ( (-pbarq*ev.p.E-pq*ebar)*ev.omega + ebar*ev.p.E*q4sq +
	1	pbarq*pq - (-pbarp-Mh2)/2.*q2 ) * kf2_over_2m_allsq
	  WT =	- (-pbarp+Mh2)*f1sq - qbarq*f1*kF2
	1	+ (2.*pbarq*pq + (-pbarp-Mh2)*q4sq) * kf2_over_2m_allsq
	  WS =	(ev.p.p*sin_gamma)**2 * (f1sq - q4sq*kf2_over_2m_allsq)
	  WI =	ev.p.p*sin_gamma * ( -(ebar+ev.p.E)*f1sq + ((-pbarq-pq)*
	1	ev.omega+(ebar+ev.p.E)*q4sq)*kf2_over_2m_allsq )
	endif

	allsum = termC*WC + termT*WT + termS*WS + termI*WI
	if (deForest_flag.le.0) allsum = allsum/4.0
	deForest = sigMott(ev) * ev.p.P * allsum/ebar
	if(debug_flag(5).eq.1)write(6,*) 'deForest',GE,GM
	deForest = deForest*10000.	! convert from fm^2 to ub

	return
	end

!-------------------------------------------------------------------------

	subroutine fofa(qsquar,GE,GM)

	implicit none
	include 'simulate.inc'

	real*8	qsquar,GE,GM
	real*8	qqg,qqp,c1,c2,c3,c4,f1a,f2a,f1v,f2vk,f1s,f2sk,f1p,f2p
	real*8	rmrho2,crho,rkrho,rks,rmomg2,comg,rkomg,rkv,rlam12,rlam22
	real*8	rlamq2

! Form factor computation
! Use dipole fit for electric formfactor, Gari Krumpelmann for magnetic
! formfactor

	qqg = abs(hc**2*qsquar*1.e-6)

! ... Gari and Krumpelmann fit to form factors
! ... From subroutine PHASPA:NFORM.FOR (Peter's), ref Zeit. Phys. A322
! ... (1985), 689

	rmrho2	= 0.6022
	crho	= 0.377
	rkrho	= 6.62
	rks	= -0.12
	rmomg2	= 0.6147
	comg	= 0.411
	rkomg	= 0.163
	rkv	= 3.706
	rlam12	= 0.632
	rlam22	= 5.153
	rlamq2	= 0.0841

	qqp	= qqg*log(((rlam22+qqg)/rlamq2))/log(rlam22/rlamq2)
	c1	= rlam12/(rlam12+qqp)
	c2	= rlam22/(rlam22+qqp)
	f1a	= c1*c2
	f2a	= f1a*c2
	c3	= rmrho2/(rmrho2+qqg)
	c4	= rmomg2/(rmomg2+qqg)
	f1v	= (c3*crho+(1-crho))*f1a
	f2vk	= (c3*crho*rkrho+(rkv-crho*rkrho))*f2a
	f1s	= (c4*comg+(1-comg))*f1a
	f2sk	= (c4*comg*rkomg+(rks-comg*rkomg))*f2a
	f1p	= 0.5*(f1s+f1v)
	f2p	= 0.5*(f2sk+f2vk)

! ........ GE = f1p + qmu4mp*f2p

	GE	= (1/(1-qsquar/18.234))**2
	GM	= f1p + f2p

	return
	end

!-------------------------------------------------------------------------

	subroutine fofa_best_fit(qsquar,GE,GM)

*	csa 9/14/98 -- This calculates the form factors Gep and Gmp using
*	Peter Bosted's fit to world data (Phys. Rev. C 51, 409, Eqs. 4
*	and 5 or, alternatively, Eqs. 6)

	implicit none
	include 'simulate.inc'

	real*8  qsquar,GE,GM,mu_p
	real*8  Q,Q2,Q3,Q4,Q5,denom

	mu_p = 2.793

	Q2 = -qsquar*(hc**2.)*1.e-6
	Q  = sqrt(max(Q2,0.d0))

	Q3 = Q**3.
	Q4 = Q**4.
	Q5 = Q**5.

* Use Eqs 4, 5:
	denom = 1. + 0.62*Q + 0.68*Q2 + 2.8*Q3 + 0.83*Q4
	GE = 1./denom
	denom = 1. + 0.35*Q + 2.44*Q2 + 0.5*Q3 + 1.04*Q4 + 0.34*Q5
	GM = mu_p/denom

* OR Eqs 6:
*	denom = 1. + 0.14*Q + 3.01*Q2 + 0.02*Q3 + 1.20*Q4 + 0.32*Q5
*	GE = 1./denom
*	GM = mu_p/denom

	return
	end


!-------------------------------------------------------------------------

	real*8 function sigMott(ev)

	implicit none
	include 'simulate.inc'

	record /event/	ev

! The Mott cross section (for a point nucleus)

	sigMott = ( 2.*alpha*hc * ev.e.E * cos(ev.e.th_phys/2.) / ev.Q2 ) **2

	return
	end

!--------------------------------------------------------------------------

	real*8 function get_s_ji(ev)

C========================================================================c
c  calculate the spectral function for Fe using                          c
c  using Ji's G matrix for nuclear matter. There are three corrections:  c
c  1. An energy shift to give the correct nucleon sep. energy            c
c  2. A relativistic correction for large momentum                       c
c  3. A correction for the ratio of momentum distributions of a Finite   c
c     Nucleus relative to Nuclear Matter                                 c
c========================================================================c

	include 'simulate.inc'

	include 'gmats.inc'

	double precision ee, xk, relcor, spec_Ji
	real*8 E_s,p1_mag,S_p_E,FNcorrection,integ_Ji
	real*8 NM_theory(ntheorymax),FN_theory(ntheorymax)
	real*8 Pm_values(ntheorymax)
	record /axis/ nk_NM_theory,nk_FN_theory
	integer i,iNM,iFN
	logical first/.true./

	record /event/ ev

	parameter	(k_f=270.)

	if (first) then
	  first = .false.
	  open(unit=80, file='gmat.theory', status='old', readonly)
	  read(80,*) gmat
	  close(80)

	  open(unit=1,file='4pi_nk_nm.dat',status='old',readonly,shared)
	  open(unit=2,file='4pi_nk_'//theory_target//'.dat',
	1	status='old',readonly,shared)
	  if (theory_target .eq. 'c12') integ_Ji = 4.80e-04
	  if (theory_target .eq. 'fe56') integ_Ji = 4.85e-04
	  if (theory_target .eq. 'au197') integ_Ji = 4.74e-04

	  i = 1
 10	  read(1,*,end=11) Pm_values(i),NM_theory(i)
	  i = i + 1
	  goto 10

 11	  nk_NM_theory.n = i-1
	  nk_NM_theory.bin = Pm_values(2) - Pm_values(1)

	  i = 1
 12	  read(2,*,end=13) Pm_values(i),FN_theory(i)
	  i = i + 1
	  goto 12

 13	  nk_FN_theory.n = i-1
	  nk_FN_theory.bin = Pm_values(2) - Pm_values(1)

	  close(1)
	  close(2)
	endif

	E_s    = ev.Em
	p1_mag = abs(ev.Pm)

C correct for nucleon sep. energy and unit conversion

! ... assuming a separation energy for nuclear matter of 27.5 MeV

	ee = -(E_s + (27.5-E_Fermi))/hc
	xk = p1_mag/hc

C relativistic correction
	if (p1_mag .ge. k_f) then
	   relcor = sqrt(p1_mag*p1_mag+Mh2)-Mh-p1_mag*p1_mag/2./Mh
	   ee = ee + relcor/hc
	endif

	iNM = nint(1.0 + abs(ev.Pm/1000.)/nk_NM_theory.bin)
	iFN = nint(1.0 + abs(ev.Pm/1000.)/nk_FN_theory.bin)
	if (abs(ev.Pm)/1000. .ge. 0.5) then
	  if (theory_target .eq. 'c12') then
	    FNcorrection = 1./1.42
	  else
	    FNcorrection = 1.0
	  endif
	else
	  FNcorrection = FN_theory(iFN)/NM_theory(iNM)
	endif

	S_p_E = FNcorrection * target.Z / integ_Ji * spec_Ji(ee, xk)
	get_s_ji = S_p_E/(1000.**4)

	return
	end

	function spec_Ji(ee, xk)
c=================================================================c
c  calculate the spectral function for nuclear matter             c
c=================================================================c
	implicit double precision(a-h, o-z)

	include 'gmats.inc'

	xkf = 1.36d0
	pi = 3.14159265359d0
	em = 939.d0/197.3d0
	fac = 4.d0*pi/3.d0*xkf**3

	sim = ximse(xk, ee)
	deno = sim**2 + (ee - spe(xk))**2
	spec_Ji = sim/pi/fac/deno     !final spectral function for ee, xk
	return

	end

	real*8 function ximse(xk, ee)
c==================================================================c
c  calculate imaginary part of the self-energy                     c
c==================================================================c
	implicit double precision(a-h, o-z)

	include 'gmats.inc'

	pi = 3.14159265359d0
	xkf = 1.36d0
	sum = 0.d0
	nqp = 27
	do 10 iqp = 1, nqp
	  qp = dble(iqp) * xkf / dble(nqp)
	  jqp = int(qp*20)

	  rat = dble(qp) / xkf
	  qba = dsqrt(0.6d0 * xkf**2 * (1.d0-rat)*(1.d0+rat**2/3.d0/(2.d0+rat)))

	  call root(xk, ee, qba, qp, q, skip)
	  if(skip.eq.1.d0) go to 10
	  jq = int(q*20)
	  if(jq.gt.330) go to 10
	  if(jq.eq.0.or.jqp.eq.0) go to 10

	  if(xk.ge.xkf) then
	    if(q.gt.0.5d0*(xk-xkf).and.q.lt.0.5d0*(xk+xkf)) then
	      qbmin = dsqrt(0.5d0*(xk**2+xkf**2)-q**2)
	      qbmax = q + xk
	    else
	      qbmin = dabs(q-xk)
	      qbmax = q + xk
	    endif
	  elseif(xk.lt.xkf) then
	    if(q.gt.0.5d0*(xkf-xk).and.q.lt.0.5d0*(xk+xkf)) then
	      qbmin = dsqrt(0.5d0*(xk**2+xkf**2)-q**2)
	      qbmax = q + xk
	    elseif(q.ge.0.5d0*(xkf+xk)) then
	      qbmin = dabs(q-xk)
	      qbmax = q + xk
	    else
	      go to 10
	    endif
	  endif

	  sum1 = 0.d0
	  nqb = 20
	  dqb = (qbmax-qbmin)/nqb
	  do 20 iqb = 1, nqb
	    qb = dble(iqb)*dqb + qbmin
	    if(qp.gt.0.d0.and.qp.lt.xkf-qb.and.qb.lt.xkf) then
	      pp = 1.d0
	    else if(qp.gt.xkf-qb.and.qp.lt.dsqrt(xkf**2-qb**2)
     &		    .and.qb.lt.xkf) then
	      pp = (xkf**2 - qp**2-qb**2)/2.d0/qp/qb
	    else if(qb.gt.xkf.or.(qp.gt.sqrt(xkf**2-qb**2).and.qp.lt.xkf)) then
	      pp = 0.d0
	    endif
	    sum1 = sum1 + qb * pp * dqb
20	  continue

	  deri = dabs( (deno(qba,xk,q+0.010d0,qp,ee) -
     &		 deno(qba,xk,q,qp,ee) )/0.01d0 )
	  fac1 = 8.d0*q/pi/xk/deri

	  sum = sum + fac1 * qp**2 * sum1 * gmat(jq, jqp)/22.65d0
10	continue
	ximse = sum * xkf / nqp
	return
	end

	real*8 function deno(qba, xk, q, qp, ee)
c==================================================================c
c   energy conservation function in two-body channel               c
c==================================================================c
	implicit double precision(a-h, o-z)

	xkf = 1.36d0
	if(qp.gt.0.d0.and.qp.lt.xkf-qba.and.qba.lt.xkf) then
	  pp = 1.d0
	else if(qp.gt.xkf-qba.and.qp.lt.dsqrt(xkf**2-qba**2).and.qba.lt.xkf)then
	  pp = (xkf**2 - qp**2 - qba**2)/2.d0/qp/qba
	else if(qba.gt.xkf.or.(qp.gt.sqrt(xkf**2-qba**2).and.qp.lt.xkf)) then
	  pp = 0.d0
	endif
	y1 = 2.d0*q**2+2.d0*qba**2-xk**2
	y2 = qp**2 + qba**2 + 2./dsqrt(3.d0)*qp*qba*pp
	y3 = qp**2 + qba**2 - 2./dsqrt(3.d0)*qp*qba*pp
	x1 = dsqrt(y1 + 1.d-6)
	x2 = dsqrt(y2 + 1.d-6)
	x3 = dsqrt(y3 + 1.d-6)
	deno = ee + spe(x1) - spe(x2) - spe(x3)
	return

	end
	real*8 function spe(xx)
c==================================================================c
c   single-particle energy                                         c
c==================================================================c
	implicit double precision(a-h, o-z)

	xkf = 1.36d0
	if(xx**2.le.0.7d0*xkf**2) then
	  spe = xx**2/2/0.607d0 + (-1.49d0*xx**4-86.72d0)/41.47d0
	elseif(xx**2.ge.0.7d0*xkf**2.and.xx**2.le.3.4d0*xkf**2) then
	  spe = xx**2/2/0.650d0 + (-0.549d0*xx**4-84.95d0)/41.47d0
	elseif(xx**2.ge.3.4d0*xkf**2) then
	  spe = -0.0766d0*xx**2
	  if (spe .lt. -70.d0) then
	    spe = xx**2/2.d0 + 28.87d0/41.47d0
	  else
	    spe = xx**2/2.d0 + (28.87d0-103.34d0*dexp(spe))/41.47d0
	  end if
	endif
	spe = spe*41.47d0/197.3d0
	return

	end

	subroutine root(xk, ee, qba, qp, q, skip)
c==================================================================c
c  find the root of the energy denominator                         c
c==================================================================c
	implicit double precision(a-h, o-z)

	skip = 0.d0
	kk = 0
	if(qba.gt.xk/dsqrt(2.d0)) then
	  aa = 0.d0
	else
	  aa = dsqrt(xk**2/2.d0 - qba**2 + 1.d-6)
	endif

	bb = deno(qba, xk, aa, qp, ee)

	if(qba.gt.xk/dsqrt(2.d0)) then
	  q0 = 0.d0
	else
	  q0 = dsqrt(xk**2/2.d0 - qba**2 + 1.d-6)
	endif
	f0 = deno(qba, xk, q0, qp, ee)

	q1 = 30.d0
	f1 = deno(qba, xk, q1, qp, ee)
	if(f0*f1.gt.0.d0) then
	  skip = 1.d0
	  go to 30
	endif

10	q2 = q1 - f1 * (q1 - q0)/(f1-f0)
	f2 = deno(qba, xk, q2, qp, ee)
	kk = kk + 1
	if(dabs(f2).gt.1.d-5.and.kk.lt.50) then
	  if(kk.lt.20) then
	    q0 = q1
	    f0 = f1
	    q1 = q2
	    f1 = f2
	    if(q2.lt.aa) then
	      print*, xk, ee, q2, aa
	      q1 = aa
	      f1 = bb
	    endif
	  else
	    if(f2*f0.lt.0.d0) then
	      q1 = q2
	      f1 = f2
	    else if(f2*f1.lt.0.d0) then
	      q0 = q2
	      f0 = f2
	    endif
	  endif
	  go to 10
	else
	  go to 20
	endif
20	q = q2
30	return

	end
!								gnome :)

Analyzer/Replay: Mark Jones, Documents: Stephen Wood
Powered by
ViewCVS 0.9.2-cvsgraph-1.4.0