//
// ********************************************************************
// * License and Disclaimer                                           *
// *                                                                  *
// * The  Geant4 software  is  copyright of the Copyright Holders  of *
// * the Geant4 Collaboration.  It is provided  under  the terms  and *
// * conditions of the Geant4 Software License,  included in the file *
// * LICENSE and available at  http://cern.ch/geant4/license .  These *
// * include a list of copyright holders.                             *
// *                                                                  *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work  make  any representation or  warranty, express or implied, *
// * regarding  this  software system or assume any liability for its *
// * use.  Please see the license in the file  LICENSE  and URL above *
// * for the full disclaimer and the limitation of liability.         *
// *                                                                  *
// * This  code  implementation is the result of  the  scientific and *
// * technical work of the GEANT4 collaboration.                      *
// *                                                                  *
// * Parts of this code which have been  developed by Abdel-Waged     *
// * et al under contract (31-465) to the King Abdul-Aziz City for    *
// * Science and Technology (KACST), the National Centre of           *
// * Mathematics and Physics (NCMP), Saudi Arabia.                    *
// *                                                                  *
// * By using,  copying,  modifying or  distributing the software (or *
// * any work based  on the software)  you  agree  to acknowledge its *
// * use  in  resulting  scientific  publications,  and indicate your *
// * acceptance of all terms of the Geant4 Software license.          *
// ********************************************************************
//
/// \file hadronic/Hadr02/include/G4UrQMD1_3Interface.hh
/// \brief Definition of the G4UrQMD1_3Interface class
//
// $Id: G4UrQMD1_3Interface.hh 77519 2013-11-25 10:54:57Z gcosmo $
//

#ifndef G4UrQMD1_3Interface_hh
#define G4UrQMD1_3Interface_hh

// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// MODULE:           G4UrQMD1_3Model.hh
//
// Version:          0.B
// Date:             20/12/12
// Author:           Kh. Abdel-Waged and Nuha Felemban
// Revised by:       V.V. Uzhinskii
//                   SPONSERED BY
// Customer:         KAUST/NCMP
// Contract:         31-465
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
//
// Class Description
//
//
// Class Description - End
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
///////////////////////////////////////////////////////////////////////////////

#include "globals.hh"
#include "G4SystemOfUnits.hh"

//  coms
//
const G4int  nmax  = 500;
const G4int  nspl  = 500;
const G4int  smax  = 500;
//  comres
const G4int  minnuc=1;
const G4int  minmes=100;
const G4int  maxmes=132;
const G4int  numnuc=16;
const G4int  numdel=10;
const G4int  maxnuc=minnuc+numnuc-1;
const G4int  mindel=minnuc+maxnuc;
const G4int  maxdel=mindel+numdel-1;
const G4int  minres=minnuc+1;
const G4int  maxres=maxdel;
const G4int  numlam=13;
const G4int  numsig=9;
const G4int  numcas=6;
const G4int  numome=1;
const G4int  minlam=mindel+numdel;
const G4int  maxlam=minlam+numlam-1;
const G4int  minsig=minlam+numlam;
const G4int  maxsig=minsig+numsig-1;
const G4int  mincas=minsig+numsig;
const G4int  maxcas=mincas+numcas-1;
const G4int  minome=mincas+numcas;
const G4int  maxome=minome+numome-1;
const G4int  minbar=minnuc;
const G4int  maxbar=maxome;
const G4int  offmeson=minmes;
const G4int  maxmeson=maxmes;
const G4int  maxbra=11;
const G4int  maxbrm=25;
const G4int  maxbrs1=10;
const G4int  maxbrs2=3;
const G4int  nsigs = 10;
const G4int  itblsz= 100;
const G4int  maxreac = 13;
const G4int  maxpsig = 12;
//
//comwid
//
const G4int    widnsp=120;
const G4double mintab=0.10;
const G4double maxtab1=5.0;
const G4double maxtab2=50.0;
const G4int    tabver=9;
//
// options
//
const G4int numcto=400;
const G4int numctp=400;
const G4int maxstables=20;
//
// colltab (collision tables)
//
const G4int ncollmax = 100;
//  
// inputs
//
const G4int aamax=300;
//
// newpart (new created particles)
//
const G4int  mprt=200;
const G4int  oprt=2;
//
// boxinc
//
const G4int bptmax=20;
//

// This next line is required as the default version of FORTRAN LOGICAL is
// four bytes long, whereas storage for G4bool is one byte.
//
// comnorm
const G4int n = 400;
//
// comstr
const G4int njspin=8;
//
//iso
const G4int jmax=7;

// This next line is required as the default version of FORTRAN LOGICAL is
// four bytes long, whereas storage for G4bool is one byte.
//

typedef G4int ftnlogical;

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
// Standard common block for UrQMD
// Common options for coms.f
//  20 commons
//
//
struct ccurqmd13urqmdparams
{
G4int u_at,u_zt,u_ap,u_zp;
G4double u_elab,u_imp;
G4int u_sptar,u_spproj;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13sys
{  
G4int npart, nbar, nmes, ctag,nsteps,uid_cnt,
  ranseed,event,ap,at,zp,zt,eos,dectag,
  nhardres, nsoftres, ndecres, nelcoll, nblcoll;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13rsys
{
G4double time,acttime,bdist,bimp,bmin,ebeam,ecm;
};

struct ccurqmd13comseed
{
  ftnlogical firstseed;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13logic
{
  ftnlogical lsct[nmax], logSky, logYuk, logCb, logPau;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13mdprop
{
 G4double r0_t[nmax], rx_t[nmax], ry_t[nmax], rz_t[nmax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13cuts
{
  G4double cutmax, cutPau, cutCb, cutYuk, cutSky, cutdww;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13spdata
{
  G4double spx[nspl], spPauy[nspl], outPau[nspl], 
    spCby[nspl],  outCb[nspl],
    spYuky[nspl], outYuk[nspl],
    spSkyy[nspl], outSky[nspl],
    spdwwy[nspl], outdww[nspl];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13isys
{
  
G4int spin[nmax],ncoll[nmax],charge[nmax],ityp[nmax],
  lstcoll[nmax],
  iso3[nmax],origin[nmax],strid[nmax],uid[nmax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13coor
{
G4double r0[nmax], rx[nmax], ry[nmax], rz[nmax],
  p0[nmax], px[nmax], py[nmax], pz[nmax],
  fmass[nmax], rww[nmax],dectime[nmax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13frag
{
G4double tform[nmax], xtotfac[nmax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13aios
{
G4double airx[nmax], airy[nmax], airz[nmax],
  aipx[nmax], aipy[nmax], aipz[nmax],
  aorx [4][nmax], aory[4][nmax], aorz[4][nmax],
  aopx[4][nmax], aopy[4][nmax], aopz[4][nmax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13pots
{
G4double Cb0, Yuk0, Pau0, Sky20, Sky30, gamSky, 
  gamYuk, drPau, dpPau, gw, sgw, delr, fdel,
  dt,da, db,dtimestep;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13scoor
{
G4double r0s[smax], rxs[smax], rys[smax], rzs[smax],
  p0s[smax], pxs[smax], pys[smax], pzs[smax],
  sfmass[smax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13sisys
{
  G4int sspin[smax], scharge[smax], sityp[smax], siso3[smax],
    suid[smax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13ssys
{
  G4int  nspec;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13rtdelay
{
G4double p0td[nmax][2],pxtd[nmax][2],pytd[nmax][2],pztd[nmax][2],
  fmasstd[nmax][2];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13itdelay
{
G4int ityptd[nmax][2],iso3td[nmax][2];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13svinfo
{
G4int itypt[2],uidt[2],origint[2],iso3t[2];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13ffermi
{
G4double ffermpx[nmax], ffermpy[nmax], ffermpz[nmax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13peq
{
G4double peq1, peq2;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
// Definition for Collision Term
// Commons  comres
// 4 commons
//

struct ccurqmd13versioning
{
char versiontag[45];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13resonances
{

  G4double massres[maxbar-minbar+1],widres[maxbar-minbar+1];
  G4double massmes[maxmes-minmes+1];
  G4double widmes[maxmes-minmes+1];
  G4double mmesmn[maxmes-minmes+1];
  G4double branres[maxdel-minnuc][maxbra+1];
  G4double branmes[maxmes-minmes][maxbrm+1];
      
  G4double branbs1[maxsig-minlam][maxbrs1+1];
  G4double branbs2[maxcas-mincas][maxbrs2+1];

  G4int  bs1type[maxbrs1+1][4],bs2type[maxbrs2+1][4];
  G4int lbs1[maxsig-minlam][maxbrs1+1];
  G4int lbs2[maxcas-mincas][maxbrs2+1];
  G4int lbm[maxmes-minmes][maxbrm+1];

  G4int  jres[maxbar-minbar+1];
  G4int  jmes[maxmes-minmes+1];
  G4int lbr[maxdel-minnuc][maxbra+1];
  G4int  brtype[maxbra+1][4];
  G4int  pares[maxbar-minbar+1],pames[maxmes-minmes+1];
  G4int  bmtype[maxbrm+1][4];
  G4int  isores[maxbar-minbar+1], isomes[maxmes-minmes+1];
  G4int  strres[maxbar-minbar+1],strmes[maxmes-minmes+1];
  G4int mlt2it[maxmes-minmes];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13sigtabi
{
G4int sigmaln[maxreac][2][maxpsig];
G4int sigmainf[20][nsigs];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct  ccurqmd13sigtabr
{
G4double  sigmas[itblsz][nsigs],sigmascal[5][nsigs];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

//comwid
struct ccurqmd13decaywidth
{
G4double tabx [widnsp];
G4double fbtaby [2][maxbar-minbar+1][widnsp];
G4double  pbtaby[maxbra+1][maxbar-minbar+1][2][widnsp];
G4double  fmtaby [2][maxmes-minmes+1][widnsp];
G4double  pmtaby [maxbrm+1][maxmes-minmes+1][2][widnsp];
G4int     wtabflg;

};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13brwignorm
{
G4double bwbarnorm[maxbar-minbar+1];
G4double bwmesnorm[maxmes-minmes+1];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13xsections
{
G4double tabxnd [widnsp];
G4double frrtaby[maxdel-1][2][2][widnsp];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13tabnames
{
char tabname[77];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
// options
//
struct ccurqmd13options
{
G4int    CTOption[numcto];
G4double CTParam[numctp];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13optstrings
{
char ctodc[numcto][2];
char ctpdc[numctp][2];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13loptions
{
ftnlogical fixedseed,bf13,bf14,bf15,bf16,bf17,bf18,bf19,
  bf20;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13stables
{
G4int nstable;
G4int stabvec[maxstables];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
//colltab
//
struct ccurqmd13colltab
{
G4double cttime[ncollmax+1],ctsqrts[ncollmax],
  ctsigtot[ncollmax],tmin;
G4int    cti1[ncollmax],cti2[ncollmax];
G4int    nct,actcol;
ftnlogical ctvalid[ncollmax];
G4int    ctsav[ncollmax];
G4int    nsav,apt;
G4double ctcolfluc[ncollmax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
// inputs
//
struct ccurqmd13inputs
{
G4int  nevents,spityp[2],prspflg;
G4int  trspflg,spiso3[2],outsteps,bflag,srtflag,efuncflag;
G4int  nsrt,firstev,npb;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13input2
{
G4double srtmin,srtmax,pbeam,betann,betatar,betapro;
G4double pbmin,pbmax;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13protarints
{
G4int pt_iso3[2][aamax],pt_ityp[2][aamax],pt_spin[2][aamax];
G4int pt_charge[2][aamax],pt_aa[2],pt_uid[2][aamax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13protarreals
{
G4double pt_r0[2][aamax],pt_rx[2][aamax],pt_ry[2][aamax],
  pt_rz[2][aamax],pt_fmass[2][aamax],pt_dectime[2][aamax];
G4double pt_p0[2][aamax],pt_px[2][aamax],pt_py[2][aamax],
  pt_pz[2][aamax];
G4double pt_rho[2][aamax];
G4double pt_pmax[2][aamax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

// newpart
struct ccurqmd13inewpart
{
G4int itypnew[mprt],i3new[mprt],itot[mprt],inew[mprt],nexit;
G4int iline,strcount,pslot[oprt],nstring1, nstring2,
  sidnew[mprt],itypold[oprt],iso3old[oprt];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13rnewpart
{
G4double pnew[mprt][5],xnew[mprt][4],betax,betay,betaz, 
  pold[oprt][5],p0nn,pxnn,pynn,pznn,pnn, mstring[2],
  pnnout,xtotfacold[oprt];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13fnewpart
{
G4double leadfac[mprt];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//
// boxinc
//
struct ccurqmd13boxic
{
G4int cbox;
G4int boxflag;
G4int mbox;
G4int bptityp[bptmax],bptiso3[bptmax],bptpart[bptmax];
G4int edensflag,para,solid, mbflag,mtest;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13boxrc
{
G4double bptpmax[bptmax];
G4double edens;
G4double lbox;
G4double lboxhalbe;
G4double lboxd;
G4double mbp0, mbpx, mbpy, mbpz;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// comnorm
struct ccurqmd13normsplin
{
G4double x_norm[n][4],y_norm[n][4];
G4double y2a[n][4],y2b[n][4], dx;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// comstr
struct ccurqmd13FRGSPA
{
G4double pjspns, pmix1s[njspin][3], pmix2s[njspin][3], pbars, parqls, parrs;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13FRGCPA
{
G4double pjspnc, pmix1c[njspin][3], pmix2c[njspin][3], pbarc;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13coparm
{
G4double parm[njspin];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

struct ccurqmd13const
{
G4double pi;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//// freezeout
//
struct ccurqmd13frcoor
{
G4double frr0[nmax], frrx[nmax], frry[nmax], frrz[nmax],
  frp0[nmax], frpx[nmax], frpy[nmax], frpz[nmax];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//  input
struct ccurqmd13values
{
G4double valint[1];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// cascinit
struct ccurqmd13ini
{
ftnlogical bcorr;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// iso
struct ccurqmd13factorials
{
G4double logfak[101];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
struct ccurqmd13cgks
{
G4double cgktab[jmax+1][2*jmax+1][2*jmax+1][jmax+1][jmax+1];
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// UrQMD
//
struct ccurqmd13energies
{
G4double ekinbar, ekinmes, esky2, esky3, eyuk, ecb, epau;
};

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// urqmd
extern "C"
{
extern int time_ ();
extern void loginit_();
extern void sseed_ (int*);
extern void uinit_ (int*);
extern void urqmd_ ();
extern int pdgid_ (int*, int*); //ityp

extern void g4urqmdblockdata_ ();

// urqmdparams
extern struct ccurqmd13urqmdparams  urqmdparams_;
//coms
extern struct ccurqmd13sys     sys_;
extern struct ccurqmd13rsys    rsys_;
extern struct ccurqmd13comseed comseed_;
extern struct ccurqmd13logic   logic_;
extern struct ccurqmd13mdprop  mdprop_;
extern struct ccurqmd13cuts    cuts_;
extern struct ccurqmd13spdata  spdata_;
extern struct ccurqmd13isys    isys_;
extern struct ccurqmd13coor    coor_;
extern struct ccurqmd13frag    frag_;
extern struct ccurqmd13aios    aios_;
extern struct ccurqmd13pots    pots_;
extern struct ccurqmd13scoor   scoor_;
extern struct ccurqmd13sisys   sisys_;
extern struct ccurqmd13ssys    ssys_;
extern struct ccurqmd13rtdelay rtdelay_;
extern struct ccurqmd13itdelay itdelay_;
extern struct ccurqmd13svinfo  svinfo_;
extern struct ccurqmd13ffermi  ffermi_;
extern struct ccurqmd13peq     peq_;
//comres
extern struct ccurqmd13versioning  versioning_;
extern struct ccurqmd13resonances  resonances_;
extern struct ccurqmd13sigtabi  sigtabi_;
extern struct ccurqmd13sigtabr sigtabr_;

//comwid
extern struct ccurqmd13decaywidth decaywidth_;
extern struct ccurqmd13brwignorm  brwignorm_;
extern struct ccurqmd13xsections  xsections_;
extern struct ccurqmd13tabnames   tabnames_;
//options
extern struct ccurqmd13options    options_;
extern struct ccurqmd13optstrings optstrings_;
extern struct ccurqmd13loptions    loptions_;
extern struct ccurqmd13stables     stables_;
//colltab
extern struct ccurqmd13colltab     colltab_;
//inputs
extern struct ccurqmd13inputs      inputs_;
extern struct ccurqmd13input2      input2_;
extern struct ccurqmd13protarints  protarints_;
extern struct ccurqmd13protarreals protarreals_;
//newpart
extern struct ccurqmd13inewpart    inewpart_;
extern struct ccurqmd13rnewpart    rnewpart_;
extern struct ccurqmd13fnewpart    fnewpart_;
//bocinc
extern struct ccurqmd13boxic       boxic_;
extern struct ccurqmd13boxrc       boxrc_;
// comnorm
struct ccurqmd13normsplin  normsplin_;
//comstr
struct ccurqmd13FRGSPA  FRGSPA_;
struct ccurqmd13FRGCPA  FRGCPA_;
struct ccurqmd13coparm  coparm_;
struct ccurqmd13const   const_;
// freezeout
struct ccurqmd13frcoor  frcoor_;
//urqmd
extern struct ccurqmd13energies  energies_;
//input
extern struct ccurqmd13values values_;
// cascinit
extern struct ccurqmd13ini ini_;
//iso
extern struct ccurqmd13factorials factorials_;
extern struct ccurqmd13cgks  cgks_;

}

//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
#endif
