// Вывод треугольника void ShowTr( int p1,int p2,int p3 ){ int Triangle[6] = { XC(W[p1-1]), YC(W[p1-1]), XC(W[p2-1]), YC(W[p2-1]), XC(W[p3-1]), YC(W[p3-1]) }; fillpoly(sizeof(Triangle)/sizeof(pointtype),Triangle); };
// Выводим числа void ShowNamb(){ char st[2] = "1"; for (int i=0;i<DimNods;i++){ st[0]=Mask[i]; outtextxy( XC(W[i])-10,YC(W[i])-8,st); }; };
// Выводим ребра void ShowLoops( int Ind ){ int i,j; for (i=0;i<DimLoops;i++) for (j=0;j<2;j++) switch (Ind) { case 0: Loops[i][j]=LT3[i][j]; break; case 1: Loops[i][j]=LC3[i][j]; break; case 2: Loops[i][j]=LO3[i][j]; break; case 3: Loops[i][j]=LT4[i][j]; break; case 4: Loops[i][j]=LO4[i][j]; break; case 5: Loops[i][j]=LL4[i][j]; break; case 6: Loops[i][j]=LC4[i][j]; break; case 7: Loops[i][j]=LC5[i][j]; break; case 8: Loops[i][j]=LC6[i][j]; break; case 9: Loops[i][j]=LI3[i][j]; break; }; for (i=0;i<DimLoops;i++) line( XC(W[Loops[i][0]-1]),YC(W[Loops[i][0]-1]), XC(W[Loops[i][1]-1]),YC(W[Loops[i][1]-1])); };
void pVGRID(float *xyz) { MULTIGRID *mg; ELEMENT *e; VERTEX *v; int i; mg = GetCurrentMultigrid(); ClearVertexMarkers(mg); SURFACE_LOOP_BEGIN(mg, e) for (i = 0; i < CORNERS_OF_ELEM(e); i++) { v = MYVERTEX(CORNER(e, i)); if (USED(v)) continue; SETUSED(v, 1); *xyz++ = XC(v); *xyz++ = YC(v); *xyz++ = ZC(v); } SURFACE_LOOP_END }
// Вывод четырехугольника void ShowSq( int p1,int p2,int p3,int p4 ){ int Square[8] = { XC(W[p1-1]), YC(W[p1-1]), XC(W[p2-1]), YC(W[p2-1]), XC(W[p3-1]), YC(W[p3-1]), XC(W[p4-1]), YC(W[p4-1]) }; fillpoly(sizeof(Square)/sizeof(pointtype),Square); };
bool UnitTests::WeightedDataMatrixMothur() { std::vector< std::vector<double> > dissMatrix; // weighted Bray-Curtis DiversityCalculator BC("../unit-tests/DataMatrixMothur.env", "", "Bray-Curtis", 1000, true, false, false, false, false); BC.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 0.8)) return false; if(!Compare(dissMatrix[2][0], 0.6)) return false; if(!Compare(dissMatrix[2][1], 0.8)) return false; // weighted Canberra DiversityCalculator Canberra("../unit-tests/DataMatrixMothur.env", "", "Canberra", 1000, true, false, false, false, false); Canberra.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 6.35152)) return false; if(!Compare(dissMatrix[2][0], 8.11111)) return false; if(!Compare(dissMatrix[2][1], 5.92063)) return false; // weighted Gower DiversityCalculator Gower("../unit-tests/DataMatrixMothur.env", "", "Gower", 1000, true, false, false, false, false); Gower.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 6.58333)) return false; if(!Compare(dissMatrix[2][0], 7.88889)) return false; if(!Compare(dissMatrix[2][1], 5.52778)) return false; // weighted Hellinger DiversityCalculator Hellinger("../unit-tests/DataMatrixMothur.env", "", "Hellinger", 1000, true, false, false, false, false); Hellinger.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 1.13904)) return false; if(!Compare(dissMatrix[2][0], 1.05146)) return false; if(!Compare(dissMatrix[2][1], 1.17079)) return false; // weighted Manhattan DiversityCalculator Manhattan("../unit-tests/DataMatrixMothur.env", "", "Manhattan", 1000, true, false, false, false, false); Manhattan.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 1.6)) return false; if(!Compare(dissMatrix[2][0], 1.2)) return false; if(!Compare(dissMatrix[2][1], 1.6)) return false; // weighted Morisita-Horn DiversityCalculator MH("../unit-tests/DataMatrixMothur.env", "", "Morisita-Horn", 1000, true, false, false, false, false); MH.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 0.873239)) return false; if(!Compare(dissMatrix[2][0], 0.333333)) return false; if(!Compare(dissMatrix[2][1], 0.859155)) return false; // weighted Soergel DiversityCalculator Soergel("../unit-tests/DataMatrixMothur.env", "", "Soergel", 1000, true, false, false, false, false); Soergel.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 0.88888901)) return false; if(!Compare(dissMatrix[2][0], 0.75)) return false; if(!Compare(dissMatrix[2][1], 0.88888901)) return false; // weighted species profile /* DiversityCalculator SP("../unit-tests/DataMatrixMothur.env", "", "Species profile", 1000, true, false, false, false, false); SP.Dissimilarity("../unit-tests/temp.diss"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 0.78740102)) return false; if(!Compare(dissMatrix[2][0], 0.44721401)) return false; if(!Compare(dissMatrix[2][1], 0.78102499)) return false; */ // weighted Chi-squared // Note: EBD uses a slightly different form of the Chi-squared measure as suggested in Numerical Ecology by Legendre adn Legendre // Nonetheless, it is easy to verify this using mothur. Simply divide by sqrt(N), N is the total number of sequences. DiversityCalculator ChiSquared("../unit-tests/DataMatrixMothur.env", "", "Chi-squared", 1000, true, false, false, false, false); ChiSquared.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 1.0973200)) return false; if(!Compare(dissMatrix[2][0], 0.96513098)) return false; if(!Compare(dissMatrix[2][1], 1.1147900)) return false; // weighted Euclidean DiversityCalculator Euclidean("../unit-tests/DataMatrixMothur.env", "", "Euclidean", 1000, true, false, false, false, false); Euclidean.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 0.78740102)) return false; if(!Compare(dissMatrix[2][0], 0.44721401)) return false; if(!Compare(dissMatrix[2][1], 0.78102499)) return false; // weighted Kulczynski DiversityCalculator Kulczynski("../unit-tests/DataMatrixMothur.env", "", "Kulczynski", 1000, true, false, false, false, false); Kulczynski.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 0.8)) return false; if(!Compare(dissMatrix[2][0], 0.6)) return false; if(!Compare(dissMatrix[2][1], 0.8)) return false; // weighted Pearson DiversityCalculator uPearson("../unit-tests/DataMatrixMothur.env", "", "Pearson", 1000, true, false, false, false, false); uPearson.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 1.22089)) return false; if(!Compare(dissMatrix[2][0], 0.5)) return false; if(!Compare(dissMatrix[2][1], 1.2008)) return false; // weighted Yue-Clayton DiversityCalculator YC("../unit-tests/DataMatrixMothur.env", "", "YueClayton", 1000, true, false, false, false, false); YC.Dissimilarity("../unit-tests/temp", "UPGMA"); ReadDissMatrix("../unit-tests/temp.diss", dissMatrix); if(!Compare(dissMatrix[1][0], 0.93233103)) return false; if(!Compare(dissMatrix[2][0], 0.5)) return false; if(!Compare(dissMatrix[2][1], 0.92424202)) return false; return true; }
static INT TecplotCommand (INT argc, char **argv) { INT i,j,k,v; /* counters etc. */ INT counter; /* for formatting output */ char item[1024],it[256]; /* item buffers */ INT ic=0; /* item length */ VECTOR *vc; /* a vector pointer */ ELEMENT *el; /* an element pointer */ MULTIGRID *mg; /* our multigrid */ char filename[NAMESIZE]; /* file name for output file */ PFILE *pf; /* the output file pointer */ INT nv; /* number of variables (eval functions) */ EVALUES *ev[MAXVARIABLES]; /* pointers to eval function descriptors */ char ev_name[MAXVARIABLES][NAMESIZE]; /* names for eval functions */ char s[NAMESIZE]; /* name of eval proc */ char zonename[NAMESIZE+7] = ""; /* name for zone (initialized to empty string) */ INT numNodes; /* number of data points */ INT numElements; /* number of elements */ INT gnumNodes; /* number of data points globally */ INT gnumElements; /* number of elements globallay */ PreprocessingProcPtr pre; /* pointer to prepare function */ ElementEvalProcPtr eval; /* pointer to evaluation function */ DOUBLE *CornersCoord[MAX_CORNERS_OF_ELEM]; /* pointers to coordinates */ DOUBLE LocalCoord[DIM]; /* is one of the corners local coordinates */ DOUBLE local[DIM]; /* local coordinate in DOUBLE */ DOUBLE value; /* returned by user eval proc */ INT oe,on; INT saveGeometry; /* save geometry flag */ /* get current multigrid */ mg = GetCurrentMultigrid(); if (mg==NULL) { PrintErrorMessage('W',"tecplot","no multigrid open\n"); return (OKCODE); } /* scan options */ nv = 0; saveGeometry = 0; for(i=1; i<argc; i++) { switch(argv[i][0]) { case 'e' : /* read eval proc */ if (nv>=MAXVARIABLES) { PrintErrorMessage('E',"tecplot","too many variables specified\n"); break; } sscanf(argv[i],"e %s", s); ev[nv] = GetElementValueEvalProc(s); if (ev[nv]==NULL) { PrintErrorMessageF('E',"tecplot","could not find eval proc %s\n",s); break; } if (sscanf(argv[i+1],"s %s", s) == 1) { strcpy(ev_name[nv],s); i++; } else strcpy(ev_name[nv],ev[nv]->v.name); nv++; break; case 'z' : sscanf(argv[i],"z %s", zonename+3); memcpy(zonename, "T=\"", 3); memcpy(zonename+strlen(zonename), "\", \0", 4); break; case 'g' : sscanf(argv[i],"g %d", &saveGeometry); if (saveGeometry<0) saveGeometry=0; if (saveGeometry>1) saveGeometry=1; break; } } if (nv==0) UserWrite("tecplot: no variables given, printing mesh data only\n"); /* get file name and open output file */ if (sscanf(argv[0],expandfmt(CONCAT3(" tecplot %",NAMELENSTR,"[ -~]")),filename)!=1) { PrintErrorMessage('E',"tecplot","could not read name of logfile"); return(PARAMERRORCODE); } pf = pfile_open(filename); if (pf==NULL) return(PARAMERRORCODE); /********************************/ /* TITLE */ /********************************/ ic = 0; sprintf(it,"TITLE = \"UG TECPLOT OUTPUT\"\n"); strcpy(item+ic,it); ic+=strlen(it); sprintf(it,"VARIABLES = \"X\", \"Y\""); strcpy(item+ic,it); ic+=strlen(it); if (DIM==3) { sprintf(it,", \"Z\""); strcpy(item+ic,it); ic+=strlen(it); } for (i=0; i<nv; i++) { sprintf(it,", \"%s\"",ev[i]->v.name); strcpy(item+ic,it); ic+=strlen(it); } sprintf(it,"\n"); strcpy(item+ic,it); ic+=strlen(it); pfile_master_puts(pf,item); ic=0; /********************************/ /* compute sizes */ /********************************/ /* clear VCFLAG on all levels */ for (k=0; k<=TOPLEVEL(mg); k++) for (vc=FIRSTVECTOR(GRID_ON_LEVEL(mg,k)); vc!=NULL; vc=SUCCVC(vc)) SETVCFLAG(vc,0); /* run thru all levels of elements and set index */ numNodes = numElements = 0; for (k=0; k<=TOPLEVEL(mg); k++) for (el=FIRSTELEMENT(GRID_ON_LEVEL(mg,k)); el!=NULL; el=SUCCE(el)) { if (!EstimateHere(el)) continue; /* process finest level elements only */ numElements++; /* increase element counter */ for (i=0; i<CORNERS_OF_ELEM(el); i++) { vc = NVECTOR(CORNER(el,i)); if (VCFLAG(vc)) continue; /* we have this one already */ VINDEX(vc) = ++numNodes; /* number of data points, begins with 1 ! */ SETVCFLAG(vc,1); /* tag vector as visited */ } } #ifdef ModelP gnumNodes = TPL_GlobalSumINT(numNodes); gnumElements = TPL_GlobalSumINT(numElements); on=get_offset(numNodes); oe=get_offset(numElements); /* clear VCFLAG on all levels */ for (k=0; k<=TOPLEVEL(mg); k++) for (vc=FIRSTVECTOR(GRID_ON_LEVEL(mg,k)); vc!=NULL; vc=SUCCVC(vc)) SETVCFLAG(vc,0); /* number in unique way */ for (k=0; k<=TOPLEVEL(mg); k++) for (el=FIRSTELEMENT(GRID_ON_LEVEL(mg,k)); el!=NULL; el=SUCCE(el)) { if (!EstimateHere(el)) continue; /* process finest level elements only */ for (i=0; i<CORNERS_OF_ELEM(el); i++) { vc = NVECTOR(CORNER(el,i)); if (VCFLAG(vc)) continue; /* we have this one already */ VINDEX(vc) += on; /* add offset */ SETVCFLAG(vc,1); /* tag vector as visited */ } } #else gnumNodes = numNodes; gnumElements = numElements; oe=on=0; #endif /********************************/ /* write ZONE data */ /* uses FEPOINT for data */ /* uses QUADRILATERAL in 2D */ /* and BRICK in 3D */ /********************************/ /* write zone record header */ if (DIM==2) sprintf(it,"ZONE %sN=%d, E=%d, F=FEPOINT, ET=QUADRILATERAL\n", zonename, gnumNodes,gnumElements); if (DIM==3) sprintf(it,"ZONE %sN=%d, E=%d, F=FEPOINT, ET=BRICK\n", zonename, gnumNodes,gnumElements); strcpy(item+ic,it); ic+=strlen(it); pfile_master_puts(pf,item); ic=0; /* write data in FEPOINT format, i.e. all variables of a node per line*/ for (k=0; k<=TOPLEVEL(mg); k++) for (vc=FIRSTVECTOR(GRID_ON_LEVEL(mg,k)); vc!=NULL; vc=SUCCVC(vc)) SETVCFLAG(vc,0); /* clear all flags */ counter=0; for (k=0; k<=TOPLEVEL(mg); k++) for (el=FIRSTELEMENT(GRID_ON_LEVEL(mg,k)); el!=NULL; el=SUCCE(el)) { if (!EstimateHere(el)) continue; /* process finest level elements only */ for (i=0; i<CORNERS_OF_ELEM(el); i++) CornersCoord[i] = CVECT(MYVERTEX(CORNER(el,i))); /* x,y,z of corners */ for (i=0; i<CORNERS_OF_ELEM(el); i++) { vc = NVECTOR(CORNER(el,i)); if (VCFLAG(vc)) continue; /* we have this one alre ady */ SETVCFLAG(vc,1); /* tag vector as visited */ sprintf(it,"%g",(double)XC(MYVERTEX(CORNER(el,i)))); strcpy(item+ic,it); ic+=strlen(it); sprintf(it," %g",(double)YC(MYVERTEX(CORNER(el,i)))); strcpy(item+ic,it); ic+=strlen(it); if (DIM == 3) { sprintf(it," %g",(double)ZC(MYVERTEX(CORNER(el,i)))); strcpy(item+ic,it); ic+=strlen(it); } /* now all the user variables */ /* get local coordinate of corner */ LocalCornerCoordinates(DIM,TAG(el),i,local); for (j=0; j<DIM; j++) LocalCoord[j] = local[j]; for (v=0; v<nv; v++) { pre = ev[v]->PreprocessProc; eval = ev[v]->EvalProc; /* execute prepare function */ /* This is not really equivalent to the FEBLOCK-version sinc we call "pre" more often than there. D.Werner */ if (pre!=NULL) pre(ev_name[v],mg); /* call eval function */ value = eval(el,(const DOUBLE **)CornersCoord,LocalCoord); sprintf(it," %g",value); strcpy(item+ic,it); ic+=strlen(it); } sprintf(it,"\n"); strcpy(item+ic,it); ic+=strlen(it); pfile_tagged_puts(pf,item,counter+on); ic=0; counter++; } } pfile_sync(pf); /* end of segment */ sprintf(it,"\n"); strcpy(item+ic,it); ic+=strlen(it); pfile_master_puts(pf,item); ic=0; /* finally write the connectivity list */ counter=0; for (k=0; k<=TOPLEVEL(mg); k++) for (el=FIRSTELEMENT(GRID_ON_LEVEL(mg,k)); el!=NULL; el=SUCCE(el)) { if (!EstimateHere(el)) continue; /* process finest level elements only */ switch(DIM) { case 2 : switch(TAG(el)) { case TRIANGLE : sprintf(it,"%d %d %d %d\n", VINDEX(NVECTOR(CORNER(el,0))), VINDEX(NVECTOR(CORNER(el,1))), VINDEX(NVECTOR(CORNER(el,2))), VINDEX(NVECTOR(CORNER(el,2))) ); break; case QUADRILATERAL : sprintf(it,"%d %d %d %d\n", VINDEX(NVECTOR(CORNER(el,0))), VINDEX(NVECTOR(CORNER(el,1))), VINDEX(NVECTOR(CORNER(el,2))), VINDEX(NVECTOR(CORNER(el,3))) ); break; default : UserWriteF("tecplot: unknown 2D element type with tag(el) = %d detected. Aborting further processing of command tecplot\n", TAG(el)); return CMDERRORCODE; break; } break; case 3 : switch(TAG(el)) { case HEXAHEDRON : sprintf(it,"%d %d %d %d " "%d %d %d %d\n", VINDEX(NVECTOR(CORNER(el,0))), VINDEX(NVECTOR(CORNER(el,1))), VINDEX(NVECTOR(CORNER(el,2))), VINDEX(NVECTOR(CORNER(el,3))), VINDEX(NVECTOR(CORNER(el,4))), VINDEX(NVECTOR(CORNER(el,5))), VINDEX(NVECTOR(CORNER(el,6))), VINDEX(NVECTOR(CORNER(el,7))) ); break; case TETRAHEDRON : sprintf(it,"%d %d %d %d " "%d %d %d %d\n", VINDEX(NVECTOR(CORNER(el,0))), VINDEX(NVECTOR(CORNER(el,1))), VINDEX(NVECTOR(CORNER(el,2))), VINDEX(NVECTOR(CORNER(el,2))), VINDEX(NVECTOR(CORNER(el,3))), VINDEX(NVECTOR(CORNER(el,3))), VINDEX(NVECTOR(CORNER(el,3))), VINDEX(NVECTOR(CORNER(el,3))) ); break; case PYRAMID : sprintf(it,"%d %d %d %d " "%d %d %d %d\n", VINDEX(NVECTOR(CORNER(el,0))), VINDEX(NVECTOR(CORNER(el,1))), VINDEX(NVECTOR(CORNER(el,2))), VINDEX(NVECTOR(CORNER(el,3))), VINDEX(NVECTOR(CORNER(el,4))), VINDEX(NVECTOR(CORNER(el,4))), VINDEX(NVECTOR(CORNER(el,4))), VINDEX(NVECTOR(CORNER(el,4))) ); break; case PRISM : sprintf(it,"%d %d %d %d " "%d %d %d %d\n", VINDEX(NVECTOR(CORNER(el,0))), VINDEX(NVECTOR(CORNER(el,1))), VINDEX(NVECTOR(CORNER(el,2))), VINDEX(NVECTOR(CORNER(el,2))), VINDEX(NVECTOR(CORNER(el,3))), VINDEX(NVECTOR(CORNER(el,4))), VINDEX(NVECTOR(CORNER(el,5))), VINDEX(NVECTOR(CORNER(el,5))) ); break; default : UserWriteF("tecplot: unknown 3D element type with tag(el) = %d detected. Aborting further processing of command tecplot\n", TAG(el)); return CMDERRORCODE; break; } break; } strcpy(item+ic,it); ic+=strlen(it); pfile_tagged_puts(pf,item,counter+oe); ic=0; counter++; } pfile_sync(pf); /* end of segment */ /********************************/ /* GEOMETRY */ /* we will do this later, since */ /* domain interface will change */ /********************************/ pfile_close(pf); return(OKCODE); }