static numout* loadLib(void* handle, char * lib) { numout * cc=malloc(sizeof(numout)); char name[100]; if(!handle) {free(cc); return NULL;} cc->handle=handle; sprintf(name,"interface_%s",lib); cc->interface=newSymbol(handle, name); if(!cc->interface || cc->interface->nprc==0){free(cc); return NULL;} else { int i; cc->init=0; cc->Q=NULL, cc->SC=NULL; cc->link=malloc(sizeof(double*)*(1+cc->interface->nvar)); cc->link[0]=NULL; for(i=1;i<=cc->interface->nvar;i++) { char *name=cc->interface->varName[i]; cc->link[i]=varAddress(name); if(cc->link==NULL) printf("No link for %s\n",name); if(strcmp(name,"Q")==0) cc->Q=cc->interface->va+i; else if(strcmp(name,"SC")==0) cc->SC=cc->interface->va+i; } *(cc->interface->aWidth)=&aWidth; } return cc; }
int findVal(char * name, double * val) { double * va=varAddress(name); if(va) { if(va > varValues+LastVar)return 2; *val=*va; return 0; } else return 1; }
double pMass(char * name) { char *nm; int n=pTabPos(name); if(!n){printf("Wrong particle name '%s'\n",name); return 0;} nm=ModelPrtcls[abs(n)-1].mass; if(nm[0]=='0') return 0; else { REAL *ma=varAddress(nm); return fabs(*ma); } }
int m_epa__(int i, int * pString) { void * pscr = NULL; i--; for(;;) { char mstr[]="\007" "mu^- " "e^- " "e^+ " "mu^+ "; char strmen[]="\050" " Incoming particle XXX " " |Q|max = ZZZ "; int mode=1; int n; if(pc[i]<0) n=3+pc[i]; else n=2+pc[i]; improveStr(strmen,"XXX","%4.4s",mstr+1+(n-1)*mstr[0]); improveStr(strmen,"ZZZ","%s GeV",q_max_txt[i]); menu1(38,10,"",strmen, "n_sf_epa",&pscr,&mode); switch(mode) { case 0: { double v; if(1==sscanf(q_max_txt[i],"%lf",&v)) { q_max_val[i]=v; q_max_ptr[i]=q_max_val+i; return 1; } else { trim(q_max_txt[i]); q_max_ptr[i]=varAddress(q_max_txt[i]); if(!q_max_ptr[i]) { char buff[50]; sprintf(buff,"Can not find parameter '%s'",q_max_txt[i]); continue; } } return 1; } case 1: menu1(38,13,"",mstr,"",NULL,&n); if(n<3) pc[i]=n-3; else pc[i]=n-2; break; case 2: correctStr (40,16,"Enter new value ",q_max_txt[i],19,1); break; } } return 1; }
static double * paramAddress(char * name) { int k,k0; char ** f; double * res=varAddress(name); if(res) return res; if(mainChan) { CalcHEP_interface * ci=mainChan->interface; k0=ci->nvar+1; f=ci->varName+k0; for(k=0; k<ci->nfunc;k++) if(strcmp(name, f[k])==0) return ci->va+k+k0; } return NULL; }
int r_epa__(int i, char *name) { char pname[10]; double v; i--; if(2!= sscanf(name, "Equiv.Photon(particle= %s |Q|max= %[^)]",pname,q_max_txt[i])) return 0; trim(q_max_txt[i]); if(1==sscanf(q_max_txt[i],"%lf",&v)) { if (v <= 0.) return 0; q_max_val[i]=v; q_max_ptr[i]=q_max_val+i; } else { q_max_ptr[i]=varAddress(q_max_txt[i]); if(!q_max_ptr[i]) return 0; } if(strcmp(pname,"mu^-")==0) pc[i]=-2; else if(strcmp(pname,"e^-") ==0) pc[i]=-1; else if(strcmp(pname,"e^+") ==0) pc[i]= 1; else if(strcmp(pname,"mu^+")==0) pc[i]= 2; else return 0; return 1; }
int assignValFunc(char * name, double val) { double * a=varAddress(name); if(a && a<=varValues+nModelVars+nModelFunc ) {*a=val; return 0;} else {printf(" %s not found\n", name);return 1;} }
int findVal(char * name, double * val) { double * va=varAddress(name); if(va){*val=*va; return 0;} else return 1; }
int assignVal(char * name, double val) { double * a=varAddress(name); if(a && a<=varValues+nModelVars ) {*a=val; return 0;} else return 1; }
int assignVal(char * name, double val) { double * a=varAddress(name); if(a) {*a=val; return 0;} else return 1; }
static int testSubprocesses(void) { static int first=1; int err,k1,k2,i,j; double *Q; double *GG; if(first) { first=0; if(createTableOddPrtcls()) { printf("The model contains uncoupled odd patricles\n"); exit(10);} for(i=0,NC=0;i<Nodd;i++,NC++) if(strcmp(OddPrtcls[i].name,OddPrtcls[i].aname))NC++; inP=(char**)malloc(NC*sizeof(char*)); inAP=(int*)malloc(NC*sizeof(int)); inG=(int*)malloc(NC*sizeof(int)); inDelta=(double*)malloc(NC*sizeof(double)); inG_=(double*)malloc(NC*sizeof(double)); inMassAddress=(double**)malloc(NC*sizeof(double*)); inMass=(double*)malloc(NC*sizeof(double)); inNum= (int*)malloc(NC*sizeof(int)); sort=(int*)malloc(NC*sizeof(int)); code22=(numout**)malloc(NC*NC*sizeof(numout*)); inC=(int*)malloc(NC*NC*sizeof(int)); for(i=0,j=0;i<Nodd;i++) { inP[j]=OddPrtcls[i].name; inNum[j]=OddPrtcls[i].NPDG; inG[j]=(OddPrtcls[i].spin2+1)*OddPrtcls[i].cdim; if(strcmp(OddPrtcls[i].name,OddPrtcls[i].aname)) { inAP[j]=j+1; j++; inP[j]=OddPrtcls[i].aname; inG[j]=inG[j-1]; inAP[j]=j-1; inNum[j]=-OddPrtcls[i].NPDG; } else inAP[j]=j; j++; } for(i=0;i<NC;i++) sort[i]=i; for(k1=0;k1<NC;k1++) for(k2=0;k2<NC;k2++) inC[k1*NC+k2]=-1; for(k1=0;k1<NC;k1++) for(k2=0;k2<NC;k2++) if(inC[k1*NC+k2]==-1) { int kk1=inAP[k1]; int kk2=inAP[k2]; inC[k1*NC+k2]=1; if(inC[k2*NC+k1]==-1) {inC[k2*NC+k1]=0; inC[k1*NC+k2]++;} if(inC[kk1*NC+kk2]==-1) {inC[kk1*NC+kk2]=0; inC[k1*NC+k2]++;} if(inC[kk2*NC+kk1]==-1) {inC[kk2*NC+kk1]=0; inC[k1*NC+k2]++;} } for(k1=0;k1<NC;k1++) for(k2=0;k2<NC;k2++) code22[k1*NC+k2]=NULL; for(i=0,j=0;i<Nodd;i++) { inMassAddress[j]=varAddress(OddPrtcls[i].mass); if(!inMassAddress[j]) { if(strcmp(OddPrtcls[i].mass ,"0")==0) { printf("Error: odd particle '%s' has zero mass.\n",OddPrtcls[i].name); exit(5); } printf(" Model is not self-consistent:\n " " Mass identifier '%s' for particle '%s' is absent among parameetrs\n",OddPrtcls[i].mass, OddPrtcls[i].name); exit(5); } if(strcmp(OddPrtcls[i].name,OddPrtcls[i].aname)) { j++; inMassAddress[j]=inMassAddress[j-1]; } j++; } } for(Q=NULL,GG=NULL,i=0;i<nModelVars;i++) { if(strcmp(varNames[i],"Q")==0) Q=varValues+i; else if(strcmp(varNames[i],"GG")==0) GG=varValues+i; } if(Q) *Q=100; err=calcMainFunc(); if(err>0) return err; Mcdm=fabs(*(inMassAddress[0])); for(i=0;i<NC;i++) { inMass[i]=fabs(*(inMassAddress[i])); if(Mcdm>inMass[i]) Mcdm=inMass[i]; } if(Q) { *Q=2*Mcdm; assignVal("Q",2*Mcdm); err=calcMainFunc(); if(err>0) return err; } if(GG) *GG=parton_alpha(2*Mcdm/3.); for(i=0; i<NC-1;) { int i1=i+1; if(inMass[sort[i]] > inMass[sort[i1]]) { int c=sort[i]; sort[i]=sort[i1]; sort[i1]=c; if(i) i--; else i++; } else i++; } LSP=sort[0]; Mcdm=inMass[LSP]; for(i=0;i<NC;i++) { inDelta[i]= (inMass[i]-Mcdm)/Mcdm; inG_[i]=inG[i]*pow(1+inDelta[i],1.5); } for(k1=0;k1<NC;k1++) for(k2=0;k2<NC;k2++) if(code22[k1*NC+k2]) code22[k1*NC+k2]->init=0; cleanDecayTable(); return 0; }