static void fillLgrArray(void) {int i, j, m, mm; int f[4]; algvertptr lagr; j_lgrptr j_lgr; for (i = 0; i < 2 * maxvert; i++) j_lgrarray[i] = NULL; for (i = 0; i < vcs_stat.sizet; i++) { for (j = 0; j < vcs_stat.valence[i]; j++) f[j] = prtclbase[vcs_stat.vertlist[i][j].partcl-1].anti; m = 1; /* Sorting */ while (m < vcs_stat.valence[i]) if (f[m-1] >= f[m]) ++(m); else { mm = f[m-1]; f[m-1] = f[m]; f[m] = mm; if (m == 1) ++(m); else --(m); } if (vcs_stat.valence[i] == 3) f[3] = 0; lagr = lgrgn; do { if (ghostmother(lagr->fields[0]) == f[0] && ghostmother(lagr->fields[1]) == f[1] && ghostmother(lagr->fields[2]) == f[2] && ghostmother(lagr->fields[3]) == f[3]) { j_lgr = (j_lgrptr) m_alloc(sizeof(struct j_lgrrec)); j_lgr->next = j_lgrarray[i]; j_lgr->lgrnptr = lagr; j_lgrarray[i] = j_lgr; } lagr = lagr->next; } while (lagr != NULL); } }
static void emitreducecode(void) { int i, j, v1, v2; set ind1, ind2; for(i=0; i<vcs.sizet; i++) parsedverts[i]=parseVertex(i,1); fermprgemit(); formblocks(&n_vrt); makeprgcode(); for(i=0; i<vcs.sizet; i++) free(parsedverts[i]); for (i = n_vrt - 1; i >= 1; i--) { v1 = prgcode[i-1][0]; v2 = prgcode[i-1][1]; ind1=vertinfo[v1-1].ind; ind2=vertinfo[v2-1].ind; r_mult(v1,v2,set_and(ind1,ind2)); vertinfo[MIN(v1,v2)-1].g5 = vertinfo[v1-1].g5 + vertinfo[v2-1].g5; vertinfo[MIN(v1,v2)-1].ind= set_aun(set_or(ind1,ind2),set_and(ind1,ind2)); } for (i = 0; i < vcs.sizet; i++) for (j = 0; j <vcs.valence[i]; j++) { int mom,np; mom=vcs.vertlist[i][j].moment; np =vcs.vertlist[i][j].partcl; if (mom>0 && prtclbase1[np].hlp == 't') { writeF("Vrt_1:=Vrt_1*(%s**2",prtclbase1[np].massidnt); if(prtclbase1[ghostmother(np)].hlp=='*') writeF(")$\n"); else writeF("-p%d.p%d)$\n",mom,mom); } } writeF("%%\n"); }
static void filldecaylist(void) { algvertptr lgrgn1; int i, j, k, n; particleNumType pn[5], cc[3]; decaylink kk, qq; lgrgn1 = lgrgn; do { for (i = 1; i <= 4; i++) { pn[i-1] = ghostmother(lgrgn1->fields[i-1]); if (pn[i-1] != 0) pn[i-1] = prtclbase[pn[i-1]-1].anti; } pn[4] = 0; for (i = 1; i <= 4; i++) if (pn[i-1] != pn[i + 1-1] && pn[i-1] != 0) { j = 1; for (k = 1; k <= 4; k++) if (k != i) { cc[j-1] = pn[k-1]; ++(j); } n = prtclbase[pn[i-1]-1].anti; if (prtclbase[n-1].top == NULL) { prtclbase[n-1].top = (decaylink)m_alloc(sizeof(modeofdecay)); prtclbase[n-1].top->next = NULL; memcpy(prtclbase[n-1].top->part,cc,3*sizeof(particleNumType)); } else { qq = prtclbase[n-1].top; while (1) { k = 1; while (k < 4 && qq->part[k-1] == cc[k-1]) ++(k); if (k == 4) goto exi; if (qq->part[k-1] > cc[k-1]) { kk = (decaylink)m_alloc(sizeof(modeofdecay)); kk->next = qq->next; qq->next = kk; memcpy(kk->part,qq->part,3*sizeof(particleNumType)); memcpy(qq->part,cc,3*sizeof(particleNumType)); goto exi; } if (qq->next == NULL) { kk = (decaylink)m_alloc(sizeof(modeofdecay)); kk->next = qq->next; qq->next = kk; memcpy(kk->part,cc,3*sizeof(particleNumType)); goto exi; } qq = qq->next; } exi:; } } lgrgn1 = lgrgn1->next; } while (lgrgn1 != NULL); }
static int readlagrangian(int check, int ugForce) { algvertptr lgrgn1,lgrgn2; int i, j, mm; char * ss; char pPtr[4][60]; int factorShift,lorentzShift; arr4byte f_copy; int mLine,totcolor,color,spinorNumb; linelist ln; static char fName[4][5] = {"P1","P2","P3","P4"}; polyvars var_testing={0,NULL}; vardef=&(var_testing); clearlgrgn(); factorShift=tabCharPos(lgrng_tab.format,4); lorentzShift=tabCharPos(lgrng_tab.format,5); tabName=lgrng_tab.headln; for(ln=lgrng_tab.strings, nLine=1; ln; ln=ln->next, nLine++) { ss=ln->line; sscanf(ss,"%[^|]%*c%[^|]%*c%[^|]%*c%[^|]",pPtr[0],pPtr[1],pPtr[2],pPtr[3]); for(i=0;i<4;i++) trim(pPtr[i]); if(pPtr[0][0]=='%') continue; for(i=0;i<4;i++) { if(pPtr[i][0]) { locateinbase(pPtr[i],&j); if(check && j == 0) { errorMessage( fName[i]," unknown particle %s" ,pPtr[i]); return 0; } f_copy[i]=j; } else if(i==3) f_copy[3]=0; else { errorMessage( fName[i],"particle name is expected");return 0;} } if(ugForce) { for(i=0;i<4;i++) { j=f_copy[i]; if(j && ghostp(j) &&(!zeromass(j))) i=10; } if(i>=10) continue; } lgrgn1=(algvertptr)m_alloc( sizeof(*lgrgn1)); lgrgn1->next = lgrgn; lgrgn = lgrgn1; lgrgn->comcoef= ln->line+factorShift; lgrgn->description=ln->line+lorentzShift; for (i=0;i<4;i++) lgrgn->fields[i] = f_copy[i]; if(check) { totcolor=1; for (mm=0;((mm<4)&&(lgrgn->fields[mm] !=0));mm++) { color=prtclbase[lgrgn->fields[mm] -1].cdim; if (color==-3) color=5; totcolor=totcolor*color; } if( (totcolor!=1)&&(totcolor!=15)&&(totcolor!=64)&&(totcolor!=120)&&(totcolor!=512) ) { errorMessage("Lorentz part","wrong color structure"); return 0; } spinorNumb=0; for (mm=0;((mm<4)&&(lgrgn->fields[mm] !=0));mm++) { if( prtclbase1[lgrgn->fields[mm]].spin&1 ) spinorNumb++ ; } if( (spinorNumb!=0)&&(spinorNumb!=2) ) { errorMessage("Lorentz part","wrong spinor structure"); return 0; } } if (! testLgrgn(lgrgn) ) { clearVars(vardef); return 0;} } clearVars(vardef); clearpregarbage(); lgrgn1 = lgrgn; /* Sorting */ do { lgrgn1->factor=1; for(i=0;i<4 && lgrgn1->fields[i];i++) { int hlp=prtclbase[lgrgn1->fields[i]-1].hlp; if(hlp=='C') break; else if(hlp=='c') {lgrgn1->factor=-1; break;} } for (i = 1; i <= 4; i++) lgrgn1->perm[i-1] = i; i = 1; while (i < 4) if (lgrgn1->fields[i-1] >= lgrgn1->fields[i + 1-1]) ++(i); else { mm = lgrgn1->fields[i-1]; lgrgn1->fields[i-1] = lgrgn1->fields[i + 1-1]; lgrgn1->fields[i + 1-1] = mm; mm = lgrgn1->perm[i-1]; lgrgn1->perm[i-1] = lgrgn1->perm[i + 1-1]; lgrgn1->perm[i + 1-1] = mm; if (i == 1) ++(i); else --(i); } lgrgn1 = lgrgn1->next; } while (lgrgn1 != NULL); if (check) { mLine=nLine; lgrgn1 = lgrgn; /* check1 */ do { nLine--; lgrgn2=lgrgn1->next; while (lgrgn2 != NULL ) { if( (lgrgn1->fields[0]==lgrgn2->fields[0]) && (lgrgn1->fields[1]==lgrgn2->fields[1]) && (lgrgn1->fields[2]==lgrgn2->fields[2]) && (lgrgn1->fields[3]==lgrgn2->fields[3]) ) { char sss[20]=""; for(i=0;i<4;i++) if(lgrgn1->fields[i]) { strcat(sss, prtclbase1[lgrgn1->fields[i]].name); strcat(sss," ");} errorMessage("P1,P2,P3,P4","duplicate vertex {%s}",sss); return 0; } lgrgn2=lgrgn2->next; } lgrgn1= lgrgn1->next; } while (lgrgn1 != NULL); nLine=mLine; lgrgn1 = lgrgn; /* check2 */ do { nLine--; for (i=0;i<4;i++) { f_copy[i]=lgrgn1->fields[i]; if (f_copy[i] !=0) { mm=ghostmother(f_copy[i]); f_copy[i]=prtclbase[mm-1].anti + f_copy[i]-mm ; } } i = 1; while (i < 4) if (f_copy[i-1] >= f_copy[i ]) ++(i); else { mm = f_copy[i-1]; f_copy[i-1] = f_copy[i ]; f_copy[i ] = mm; if (i == 1) ++(i); else --(i); } lgrgn2=lgrgn; while ((lgrgn2 != NULL ) && ( (f_copy[0] !=lgrgn2->fields[0]) || (f_copy[1] !=lgrgn2->fields[1]) || (f_copy[2] !=lgrgn2->fields[2]) || (f_copy[3] !=lgrgn2->fields[3]) ) ) { lgrgn2=lgrgn2->next; } if (lgrgn2 == NULL) { char sss[10]; strcpy(sss,""); for (i=0;i<3;i++) { strcat (sss, prtclbase[lgrgn1->fields[i]-1].name); strcat(sss," "); } if (lgrgn1->fields[3] !=0 ) strcat(sss,prtclbase[lgrgn1->fields[3]-1].name); errorMessage("P1,P2,P3,P4","conjugated vertex for %s not found",sss); return 0; } lgrgn1= lgrgn1->next; } while (lgrgn1 != NULL); } return 1; }
static int readparticles(int check, int ugForce ) { char *ss,*endstr; char fullname[60], massname[60], imassname[60], p1[60], p2[60],numtxt[20]; char latex[STRSIZ], latex_[STRSIZ], s[60],c[60], chlp[40]; int itmp,i,j, errcode,np1,np2,nparticleLimit =128; linelist ln=prtcls_tab.strings; tabName=prtcls_tab.headln; if(prtclbase) { cleardecaylist(); clearLatexNames(); free(prtclbase);} prtclbase=(prtcl_base*) malloc(nparticleLimit*sizeof(prtcl_base)); prtclbase1=prtclbase-1; nparticles = 0; for(i=nparticles;i<nparticleLimit;i++) {prtclbase[i].top=NULL;prtclbase[i].latex=NULL;} nLine=1; while (ln != NULL) { ss=ln->line; if (nparticles >= nparticleLimit-16) { nparticleLimit+=128; prtclbase=re_alloc(prtclbase,nparticleLimit*sizeof(prtcl_base)); if(!prtclbase) { errorMessage(" P ","too many particles"); return 0; } prtclbase1=prtclbase-1; for(i=nparticles;i<nparticleLimit;i++) {prtclbase[i].top=NULL;prtclbase[i].latex=NULL;} } sscanf(ss,"%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]%*c%[^|]", fullname,p1,p2,numtxt,s,massname,imassname,c,chlp,latex,latex_); trim(p1); trim(p2); trim(latex); trim(latex_); { static char fldName[2][5]={" P "," aP"}; char * pName[2]; pName[0]=p1; pName[1]=p2; for ( i=0;i<=1;i++) { if (check && (! isPrtclName(pName[i]))) { errorMessage(fldName[i],"incorrect particle name '%s'",pName[i]); return 0; } if (check ) { locateinbase(pName[i],&j); if (j != 0) { errorMessage(fldName[i],"duplicate particle name '%s'",pName[i]); return 0; } } } } nparticles++; strcpy(prtclbase[nparticles-1].name,p1); itmp=strtol(trim(s),&endstr,10); if(check) { if (s+strlen(s) != endstr) { errorMessage("2*spin","number expected"); return 0 ; } if((itmp!=0)&&(itmp!=1)&&(itmp!=2)&&(itmp!=3)&&(itmp!=4)) { errorMessage("2*spin","value out of range"); return 0; } } prtclbase[nparticles-1].spin=itmp; if( 1!=sscanf(numtxt,"%ld",&prtclbase[nparticles-1].N)) { errorMessage("number","can't read MC numeration parameter"); return 0; } trim(massname); if(strcmp(massname,"0")==0) { if(prtclbase[nparticles-1].spin==3 || prtclbase[nparticles-1].spin==4) errorMessage("mass","spin 3/2 and spin 2 particles should be massive"); } else { int pos; errcode=findvar(massname,NULL,&pos); if (check && (errcode != 0)) { errorMessage("mass","unknown variable %s",massname); return 0; }else { if(pos>nCommonVars) nCommonVars=pos; } } strcpy(prtclbase[nparticles-1].massidnt,massname); trim(imassname); if( check && strcmp(imassname,"0")&& !strcmp(massname,"0")) { errorMessage("width","non zero width for zero mass particle '%s'", prtclbase[nparticles-1].name); return 0; } if(strcmp(imassname,"0") != 0) { errcode=findvar(imassname,NULL,NULL); if(errcode) { if(imassname[0]=='!') { imassname[0]=' '; trim(imassname); if(check && (!isVarName(imassname)) ) { errorMessage("width","incorrect name '%s'",imassname); return 0; } if(check && (!isOriginName(imassname)) ) { errorMessage("width","this identifier '%s' already was used",imassname); return 0; } { varlist mvars=modelvars+1+nmodelvar; nmodelvar++; strcpy(mvars->varname,imassname); mvars->func = NULL; mvars->varvalue = 0.; mvars->need=0; mvars->hidden=0; mvars->pwidth=nparticles; } }else { errorMessage("width","unknown variable %s",imassname); return 0; } } } strcpy(prtclbase[nparticles-1].imassidnt,imassname); itmp=strtol(trim(c),&endstr,10); if(check) { if (c+strlen(c) != endstr) { errorMessage("color","number expected"); return 0; } if (((itmp!=1)&&(itmp!=3)&&(itmp!=8))||((itmp==3)&&(strcmp(p1,p2)==0)) ) { errorMessage("color","value out of range"); return 0; } } prtclbase[nparticles-1].cdim=itmp; trim(chlp); if (strcmp(chlp,"") == 0) strcpy(chlp," "); prtclbase[nparticles-1].hlp = toupper(chlp[0]); if(check) { int ner; ner=1; switch(prtclbase[nparticles-1].hlp) { case ' ':if(prtclbase[nparticles-1].spin==2 && !strcmp(prtclbase[nparticles-1].massidnt,"0") ) { errorMessage("aux","Massless vector boson must\n" " be a gauge particle"); return 0; } break; case 'L': case 'R': if ((prtclbase[nparticles-1].spin !=1) ||((prtclbase[nparticles-1].massidnt[0])!='0') ||(strcmp(p1,p2)==0)) ner=0; break; case '*': if(prtclbase[nparticles-1].massidnt[0]=='0') ner=0; else if(prtclbase[nparticles-1].imassidnt[0]!='0') { errorMessage("aux","for aux='*' zero width is expected"); return 0;} break; case 'G': if(prtclbase[nparticles-1].spin!=2) ner=0; break; default: ner=0; } if(!ner){ errorMessage("aux","unexpeted character"); return 0;} if(prtclbase[nparticles-1].N==0 && prtclbase[nparticles-1].hlp!='*') { errorMessage("number","Zero PDG code."); return 0;} } prtclbase[nparticles-1].latex=malloc(1+strlen(latex)); strcpy(prtclbase[nparticles-1].latex,latex); np1 = ghostaddition(); if (strcmp(p1,p2) == 0) prtclbase[np1-1].anti = np1; else { ++(nparticles); prtclbase[nparticles-1] = prtclbase[np1-1]; prtclbase[nparticles-1].N *=(-1); strcpy(prtclbase[nparticles-1].name,p2); prtclbase[nparticles-1].latex=malloc(1+strlen(latex_)); strcpy(prtclbase[nparticles-1].latex,latex_); if (prtclbase[np1-1].cdim == 3) prtclbase[nparticles-1].cdim = -3; np2=ghostaddition(); prtclbase[np1-1].anti = np2; prtclbase[np2-1].anti = np1; } ln=ln->next; nLine++; } for (i = 1; i <= nparticles; i++) { prtcl_base *with1 = &prtclbase[i-1]; with1->top = NULL; if (strchr("fcCtT",with1->hlp) != NULL) { sprintf(with1->name+strlen(with1->name),".%c",with1->hlp); switch (with1->hlp) { case 'c': with1->anti = prtclbase[i-1 - 1].anti +2; break; case 'C': with1->anti = prtclbase[i-1 - 2].anti +1; break; case 'f': with1->anti = prtclbase[i-1 - 3].anti +3; break; case 't': with1->anti = prtclbase[i-1 + 1].anti -1; break; case 'T': with1->anti = prtclbase[i-1 + 2].anti -2; break; } } } if(ugForce)for(i=1; i <= nparticles; i++) if(gaugep(i) && (!zeromass(i))) prtclbase[i-1].hlp=' '; for(i=1;i<=nmodelvar;i++) if(modelvars[i].pwidth) modelvars[i].pwidth=ghostmother(modelvars[i].pwidth); return 1; }