************************************************************************
*
*     initPDFs.f:
*
*     This routine initializes the PDFs at the initial scale Q20
*     on the interpolation grid.
*
************************************************************************
      subroutine initPDFs(Q20)
*
      implicit none
*
      include "../commons/grid.h"
      include "../commons/pdfset.h"
      include "../commons/f0ph.h"
      include "../commons/fph.h"
      include "../commons/Replica.h"
      include "../commons/Evs.h"
      include "../commons/Nf_FF.h"
      include "../commons/MaxFlavourPDFs.h"
      include "../commons/IntrinsicCharm.h"
**
*     Input Variables
*
      double precision Q20
**
*     Internal Variables
*
      integer alpha
      integer ifl,ilept
      double precision f0(-6:6),fext0(-6:7),flext0(-3:3),xfxQ
      external ExternalSetAPFEL
      external ExternalSetAPFEL1
      external ExternalSetAPFELLept
      external ExternalSetAPFELRep
      external ExternalSetAPFELRep1
      external pretabulatedPDFsRep
*
*     User defined PDFs
*
      if(pdfset(1:7).eq."private")then
         do alpha=0,nin(igrid)
            call private(xg(igrid,alpha),f0)
            do ifl=-6,6
               f0ph(ifl,alpha) = f0(ifl)
            enddo
            do ilept=-3,3
               f0lep(ilept,alpha) = 0d0
            enddo
         enddo
*
*     In case one wants to use a PDF set previously evolved by APFEL
*     as an input.
*
      elseif(pdfset(1:5).eq."apfel")then
         do alpha=0,nin(igrid)
            do ifl=-6,6
               f0ph(ifl,alpha) = fph(igrid,ifl,alpha)
               if(dabs(f0ph(ifl,alpha)).lt.1d-14) f0ph(ifl,alpha) = 0d0
            enddo
            do ilept=-3,3
               f0lep(ilept,alpha) = flepton(igrid,ilept,alpha)
               if(dabs(f0lep(ilept,alpha)).lt.1d-14)
     1              f0lep(ilept,alpha) = 0d0
            enddo
         enddo
*
*     LHA Toy PDFs
*
      elseif(pdfset(1:5).eq."ToyLH")then
         do alpha=0,nin(igrid)
            call toyLHPDFs(xg(igrid,alpha),f0)
            do ifl=-6,6
               f0ph(ifl,alpha) = f0(ifl)
            enddo
            do ilept=-3,3
               f0lep(ilept,alpha) = 0d0
            enddo
         enddo
*
*     External Set
*
      elseif(pdfset(1:8).eq."external")then
         if(pdfset(9:9).eq."1")then
            do alpha=0,nin(igrid)
               call ExternalSetAPFEL1(xg(igrid,alpha),dsqrt(Q20),fext0)
               do ifl=-6,6
                  f0ph(ifl,alpha) = fext0(ifl)
               enddo
               f0lep(0,alpha) = fext0(7)
               do ilept=1,3
                  f0lep(ilept,alpha) = 0d0
                  f0lep(-ilept,alpha) = 0d0
               enddo
            enddo
         else
            do alpha=0,nin(igrid)
               call ExternalSetAPFEL(xg(igrid,alpha),dsqrt(Q20),fext0)
               do ifl=-6,6
                  f0ph(ifl,alpha) = fext0(ifl)
               enddo
               f0lep(0,alpha) = fext0(7)
               do ilept=1,3
                  f0lep(ilept,alpha) = 0d0
                  f0lep(-ilept,alpha) = 0d0
               enddo
            enddo
         endif
      elseif(pdfset(1:11).eq."repexternal")then
         if(pdfset(12:12).eq."1")then
            do alpha=0,nin(igrid)
               call ExternalSetAPFELRep1(xg(igrid,alpha),dsqrt(Q20),
     1                                   irep,fext0)
               do ifl=-6,6
                  f0ph(ifl,alpha) = fext0(ifl)
               enddo
               f0lep(0,alpha) = fext0(7)
               do ilept=1,3
                  f0lep(ilept,alpha) = 0d0
                  f0lep(-ilept,alpha) = 0d0
               enddo
            enddo
         else
            do alpha=0,nin(igrid)
               call ExternalSetAPFELRep(xg(igrid,alpha),dsqrt(Q20),
     1                                  irep,fext0)
               do ifl=-6,6
                  f0ph(ifl,alpha) = fext0(ifl)
               enddo
               f0lep(0,alpha) = fext0(7)
               do ilept=1,3
                  f0lep(ilept,alpha) = 0d0
                  f0lep(-ilept,alpha) = 0d0
               enddo
            enddo
         endif
*
*     External Set with leptons
*
      elseif(pdfset(1:12).eq."leptexternal")then
         do alpha=0,nin(igrid)
            call ExternalSetAPFELLept(xg(igrid,alpha),dsqrt(Q20),
     1                                irep,flext0,fext0)
            do ifl=-6,6
               f0ph(ifl,alpha) = fext0(ifl)
            enddo
            do ilept=-3,3
               f0lep(ilept,alpha) = flext0(ilept)
            enddo
         enddo
*
*     Kretzer's parametrization at Q2 = 0.4 GeV^2 of the light partons
*     for pi+ taken at NLO from hep-ph/0003177.
*
      elseif(pdfset(1:7).eq."kretzer")then
         do alpha=0,nin(igrid)
            call KretzerFFs(xg(igrid,alpha),f0)
            do ifl=-6,6
               f0ph(ifl,alpha) = f0(ifl)
            enddo
            do ilept=-3,3
               f0lep(ilept,alpha) = 0d0
            enddo
         enddo
*
*     HKNS parametrization at Q2 = 1 GeV^2 of the light partons
*     for pi+ taken at NLO from hep-ph/0702250 (used for the benchmark against MELA).
*
      elseif(pdfset(1:4).eq."MELA")then
         do alpha=0,nin(igrid)
            call HKNSFFs(xg(igrid,alpha),f0)
            do ifl=-6,6
               f0ph(ifl,alpha) = f0(ifl)
            enddo
            do ilept=-3,3
               f0lep(ilept,alpha) = 0d0
            enddo
         enddo
*
*     Use pretabulated PDFs on the same sugrids.
*     (for internal use).
*
      elseif(pdfset(1:12).eq."pretabulated")then
         if(pdfset(13:13).eq."1")then
            do alpha=0,nin(igrid)
               call pretabulatedPDFs1(igrid,alpha,f0,flext0)
               do ifl=-6,6
                  f0ph(ifl,alpha) = f0(ifl)
               enddo
               do ilept=-3,3
                  f0lep(ilept,alpha) = flext0(ilept)
               enddo
            enddo
         else
            do alpha=0,nin(igrid)
               call pretabulatedPDFs(igrid,alpha,f0,flext0)
               do ifl=-6,6
                  f0ph(ifl,alpha) = f0(ifl)
               enddo
               do ilept=-3,3
                  f0lep(ilept,alpha) = flext0(ilept)
               enddo
            enddo
         endif
      elseif(pdfset(1:15).eq."reppretabulated")then
         do alpha=0,nin(igrid)
            call pretabulatedPDFsRep(igrid,alpha,irep,f0)
            do ifl=-6,6
               f0ph(ifl,alpha) = f0(ifl)
            enddo
            do ilept=-3,3
               f0lep(ilept,alpha) = 0d0
            enddo
         enddo
*
*     LHAPDF set
*
      else
         if(igrid.eq.1) call mkPDFs(irep,trim(pdfset))
         do alpha=0,nin(igrid)
            do ifl=-6,6
               f0ph(ifl,alpha) = xfxQ(ifl,xg(igrid,alpha),dsqrt(Q20))
            enddo
            f0lep(0,alpha) = xfxQ(22,xg(igrid,alpha),dsqrt(Q20))
            do ilept=1,3
               f0lep(ilept,alpha) = xfxQ(9+2*ilept,
     1              xg(igrid,alpha),dsqrt(Q20))
               f0lep(-ilept,alpha) = xfxQ(-9-2*ilept,
     1              xg(igrid,alpha),dsqrt(Q20))
            enddo
         enddo
      endif
*
*     For the FFNS, erase the heavy flavour PDFs
*
      if(Evs.eq."FF".and.Nf_FF.lt.6)then
         if(IntrinsicCharm.and.Nf_FF.lt.4)then
            do alpha=0,nin(igrid)
               do ifl=5,6
                  f0ph(ifl,alpha)  = 0d0
                  f0ph(-ifl,alpha) = 0d0
               enddo
               f0lep(3,alpha)  = 0d0
               f0lep(-3,alpha) = 0d0
            enddo
         else
            do alpha=0,nin(igrid)
               do ifl=Nf_FF+1,6
                  f0ph(ifl,alpha)  = 0d0
                  f0ph(-ifl,alpha) = 0d0
               enddo
               f0lep(3,alpha)  = 0d0
               f0lep(-3,alpha) = 0d0
            enddo
         endif
*
*     For the VFNS, erase the heavy flavour beyond nfMaxPDFs
*
      elseif(Evs.eq."VF".and.nfMaxPDFs.lt.6)then
         do alpha=0,nin(igrid)
            do ifl=nfMaxPDFs+1,6
               f0ph(ifl,alpha)  = 0d0
               f0ph(-ifl,alpha) = 0d0
            enddo
         enddo
      endif
*
      return
      end
*
************************************************************************
*
*     Define external functions for OS compilation
*
************************************************************************
#ifndef DARWIN
      subroutine ExternalSetAPFEL(x,Q,xf)
      double precision x,Q,xf(-6:7)
      return
      end
      subroutine ExternalSetAPFEL1(x,Q,xf)
      double precision x,Q,xf(-6:7)
      return
      end
      subroutine ExternalSetAPFELLept(x,Q,i,xl,xf)
      integer i
      double precision x,Q,xl(-3,3),xf(-6:7)
      return
      end
      subroutine ExternalSetAPFELRep(x,Q,i,xf)
      integer i
      double precision x,Q,xf(-6:7)
      return
      end
      subroutine ExternalSetAPFELRep1(x,Q,i,xf)
      integer i
      double precision x,Q,xf(-6:7)
      return
      end
      subroutine pretabulatedPDFsRep(ig,alpha,i,xf)
      integer ig,alpha,i
      double precision xf(-6:6)
      return
      end
#endif