/*--------------------*/ int main(int argc, char **argv) { DBfile *db; int i, driver = DB_PDB; char *filename = "csg.pdb"; int show_all_errors = FALSE; char *coordnames[3]; float *coord[3]; for (i=1; i<argc; i++) { if (!strncmp(argv[i], "DB_PDB",6)) { driver = StringToDriver(argv[i]); filename = "mat3d_3across.pdb"; } else if (!strncmp(argv[i], "DB_HDF5", 7)) { driver = StringToDriver(argv[i]); filename = "mat3d_3across.h5"; } else if (!strcmp(argv[i], "show-all-errors")) { show_all_errors = 1; } else if (argv[i][0] != '\0') { fprintf(stderr, "%s: ignored argument `%s'\n", argv[0], argv[i]); } } if (show_all_errors) DBShowErrors(DB_ALL_AND_DRVR, 0); coordnames[0]=strdup("x"); coordnames[1]=strdup("y"); coordnames[2]=strdup("z"); coord[0] = x; coord[1] = y; coord[2] = z; dims[0]=nx; dims[1]=ny; dims[2]=nz; db=DBCreate(filename, DB_CLOBBER, DB_LOCAL, "Mixed zone 3d test", driver); DBPutQuadmesh(db, "mesh", coordnames, coord, dims, 3, DB_FLOAT, DB_NONCOLLINEAR, NULL); dims[0]=zx; dims[1]=zy; dims[2]=zz; DBPutMaterial(db, "material", "mesh", nmat, matnos, matlist, dims, 3, mix_next, mix_mat, mix_zone, mix_vf, mixlen, DB_FLOAT, NULL); DBClose(db); free(coordnames[0]); free(coordnames[1]); free(coordnames[2]); CleanupDriverStuff(); return 0; }
/*--------------------*/ int main(int argc, char **argv) { DBfile *db; int i, driver = DB_PDB; char *filename = "csg.pdb"; char *coordnames[3]; float *coord[3]; for (i=1; i<argc; i++) { if (!strcmp(argv[i], "DB_PDB")) { driver = DB_PDB; filename = "mat3d_3across.pdb"; } else if (!strcmp(argv[i], "DB_HDF5")) { driver = DB_HDF5; filename = "mat3d_3across.h5"; } else { fprintf(stderr, "%s: ignored argument `%s'\n", argv[0], argv[i]); } } coordnames[0]=strdup("x"); coordnames[1]=strdup("y"); coordnames[2]=strdup("z"); coord[0] = x; coord[1] = y; coord[2] = z; dims[0]=nx; dims[1]=ny; dims[2]=nz; db=DBCreate(filename, DB_CLOBBER, DB_LOCAL, "Mixed zone 3d test", driver); DBPutQuadmesh(db, "mesh", coordnames, coord, dims, 3, DB_FLOAT, DB_NONCOLLINEAR, NULL); dims[0]=zx; dims[1]=zy; dims[2]=zz; DBPutMaterial(db, "material", "mesh", nmat, matnos, matlist, dims, 3, mix_next, mix_mat, mix_zone, mix_vf, mixlen, DB_FLOAT, NULL); DBClose(db); return 0; }
/*--------------------*/ int main(int argc, char **argv) { DBfile *db; int i, driver = DB_PDB; char *filename = "mat_3x3x3_3across.silo"; char *coordnames[3]; float *coord[3]; i=1; while (i < argc) { if (strcmp(argv[i], "-driver") == 0) { i++; if (strcmp(argv[i], "DB_HDF5") == 0) { driver = DB_HDF5; } else if (strcmp(argv[i], "DB_PDB") == 0) { driver = DB_PDB; } else { fprintf(stderr,"Uncrecognized driver name \"%s\"\n", argv[i]); exit(-1); } } i++; } coordnames[0]=strdup("x"); coordnames[1]=strdup("y"); coordnames[2]=strdup("z"); coord[0] = x; coord[1] = y; coord[2] = z; dims[0]=nx; dims[1]=ny; dims[2]=nz; db=DBCreate(filename, DB_CLOBBER, DB_LOCAL, "Mixed zone 2d test", driver); DBPutQuadmesh(db, "mesh", coordnames, coord, dims, 3, DB_FLOAT, DB_NONCOLLINEAR, NULL); dims[0]=zx; dims[1]=zy; dims[2]=zz; DBPutMaterial(db, "material", "mesh", nmat, matnos, matlist, dims, 3, mix_next, mix_mat, mix_zone, mix_vf, mixlen, DB_FLOAT, NULL); char *expNames[3] = {"mat1", "mat2", "mat3"}; char *expDefs[3] = {"matvf(<material>, 1)", "matvf(<material>, 2)", "matvf(<material>, 3)"}; int expTypes[3] = {DB_VARTYPE_SCALAR, DB_VARTYPE_SCALAR, DB_VARTYPE_SCALAR}; DBoptlist *optlists[3] = {NULL, NULL, NULL}; DBPutDefvars(db, "_visit_defvars", 3, expNames, expTypes, expDefs, optlists); DBClose(db); return 0; }
int main(int argc, char *argv[]) { int driver = DB_PDB; char *filename = "empty.silo"; int show_all_errors = FALSE; int i, pass; char const * const cnames[3] = {"x","y","z"}; void *coords[3] = {(void*)1,(void*)2,(void*)3}; /* really funky dummy pointers */ void *vars[3] = {(void*)1,(void*)2,(void*)3}; /* really funky dummy pointers */ void const * const vvars[3] = {(void*)1,(void*)2,(void*)3}; /* really funky dummy pointers */ void *var = (void*)1; int iarr[3] = {1,1,1}; /* dummy int array */ int ZDIMS[3] = {0,0,0}; double exts[4] = {0,0,0,0}; DBoptlist *ol = 0; double dtime = 0.0; int hide_from_gui=0; int *gnodeno = 0; int *gzoneno = 0; char *ghostn = 0; char *ghostz = 0; /* Parse command-line */ for (i=1; i<argc; i++) { if (!strncmp(argv[i], "DB_", 3)) { driver = StringToDriver(argv[i]); } else if (!strcmp(argv[i], "show-all-errors")) { show_all_errors = 1; } else if (argv[i][0] != '\0') { fprintf(stderr, "%s: ignored argument `%s'\n", argv[0], argv[i]); } } DBSetDeprecateWarnings(0); DBShowErrors(show_all_errors?DB_ALL_AND_DRVR:DB_NONE, NULL); printf("Creating test file \"%s\".\n", filename); dbfile = DBCreate(filename, DB_CLOBBER, DB_LOCAL, "test empty silo objects", driver); ol = DBMakeOptlist(10); DBAddOption(ol, DBOPT_DTIME, &dtime); DBAddOption(ol, DBOPT_HIDE_FROM_GUI, &hide_from_gui); DBAddOption(ol, DBOPT_NODENUM, gnodeno); DBAddOption(ol, DBOPT_ZONENUM, gzoneno); DBAddOption(ol, DBOPT_GHOST_NODE_LABELS, ghostn); DBAddOption(ol, DBOPT_GHOST_ZONE_LABELS, ghostz); /* first pass confirms we catch bad arguments; second pass confirms we permit empty objects */ for (pass = 0; pass < 2; pass++) { const int dt = DB_FLOAT; const int ct = DB_ZONECENT; const int ZZ = 0; /* Used for sole arg causing emptiness */ if (pass) DBSetAllowEmptyObjects(1); /* Because references to the following objects will not ever appear in a multi-xxx object, we do not currently test for support of empties... DBPutUcdsubmesh, DBPutMrgtree, DBPutMrgvar, DBPutGroupelmap Note: 'ZZ' or 'ZDIMS' is the key argument in each call that triggers an empty */ /* empty curve objects */ ASSERT(DBPutCurve(dbfile,"empty_curvea",coords[0],coords[0],dt,ZZ,OL(ol)),retval<0,retval==0); ASSERT(DBPutCurve(dbfile,"empty_curveb", 0,coords[0],dt,ZZ,OL(ol)),retval<0,retval==0); ASSERT(DBPutCurve(dbfile,"empty_curvec",coords[0], 0,dt,ZZ,OL(ol)),retval<0,retval==0); /* empty point meshes and vars */ ASSERT(DBPutPointmesh(dbfile,"empty_pointmesha",1,coords,ZZ,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutPointmesh(dbfile,"empty_pointmeshb",3, 0,ZZ,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutPointvar(dbfile,"pva","empty_pointmesha",1,vars,ZZ,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutPointvar(dbfile,"pvb","empty_pointmesha",3, 0,ZZ,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutPointvar1(dbfile,"pv1a","empty_pointmesha",var,ZZ,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutPointvar1(dbfile,"pv1b","empty_pointmesha", 0,ZZ,dt,OL(ol)),retval<0,retval==0); /* empty quad meshes and vars (ZDIMS is the magic zero'ing arg) */ ASSERT(DBPutQuadmesh(dbfile,"empty_quadmesha", 0,coords,ZDIMS,1,dt,DB_COLLINEAR,OL(ol)),retval<0,retval==0); ASSERT(DBPutQuadmesh(dbfile,"empty_quadmeshb",cnames, 0,ZDIMS,2,dt,DB_COLLINEAR,OL(ol)),retval<0,retval==0); ASSERT(DBPutQuadmesh(dbfile,"empty_quadmeshc",cnames,coords,ZDIMS,3,dt,DB_COLLINEAR,OL(ol)),retval<0,retval==0); ASSERT(DBPutQuadvar(dbfile,"qva","empty_quadmesha",2, 0,vars,ZDIMS,2,0,0,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutQuadvar(dbfile,"qvb","empty_quadmesha",3,cnames, 0,ZDIMS,3,0,0,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutQuadvar1(dbfile,"qv1a","empty_quadmesha", 0,ZDIMS,ZZ,var,0,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutQuadvar1(dbfile,"qv1b","empty_quadmesha",var,ZDIMS,ZZ, 0,0,dt,ct,OL(ol)),retval<0,retval==0); /* empty ucd meshes, facelists, zonelists and vars */ ASSERT(DBPutUcdmesh(dbfile,"empty_ucdmesh1",3,cnames,coords,ZZ,1,"foo","bar",dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdmesh(dbfile,"empty_ucdmesh2",1, 0,coords,ZZ,1,"foo","bar",dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdmesh(dbfile,"empty_ucdmesh3",2,cnames, 0,ZZ,0,"foo","bar",dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdmesh(dbfile,"empty_ucdmesh3",0, 0, 0,ZZ,0, 0, 0,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutFacelist(dbfile,"empty_facelista",ZZ,0,iarr,1,1,iarr,iarr,iarr,1,iarr,iarr,1),retval<0,retval==0); ASSERT(DBPutFacelist(dbfile,"empty_facelistb",ZZ,0, 0,1,1,iarr,iarr,iarr,1,iarr,iarr,1),retval<0,retval==0); ASSERT(DBPutFacelist(dbfile,"empty_facelistc",ZZ,0,iarr,1,1, 0,iarr,iarr,1,iarr,iarr,1),retval<0,retval==0); ASSERT(DBPutFacelist(dbfile,"empty_facelistd",ZZ,0,iarr,1,1,iarr, 0,iarr,1,iarr,iarr,1),retval<0,retval==0); ASSERT(DBPutFacelist(dbfile,"empty_faceliste",ZZ,0,iarr,1,1,iarr,iarr, 0,1,iarr,iarr,1),retval<0,retval==0); ASSERT(DBPutFacelist(dbfile,"empty_facelistf",ZZ,0,iarr,1,1,iarr,iarr,iarr,1, 0,iarr,1),retval<0,retval==0); ASSERT(DBPutFacelist(dbfile,"empty_facelistg",ZZ,0,iarr,1,1,iarr,iarr,iarr,1,iarr, 0,1),retval<0,retval==0); ASSERT(DBPutZonelist(dbfile,"empty_zonelista",ZZ,1,iarr,10,0,iarr,iarr,10),retval<0,retval==0); ASSERT(DBPutZonelist(dbfile,"empty_zonelistb",ZZ,1, 0,10,0,iarr,iarr,10),retval<0,retval==0); ASSERT(DBPutZonelist(dbfile,"empty_zonelistc",ZZ,1,iarr,10,0, 0,iarr,10),retval<0,retval==0); ASSERT(DBPutZonelist(dbfile,"empty_zonelistd",ZZ,1,iarr,10,0,iarr, 0,10),retval<0,retval==0); ASSERT(DBPutZonelist2(dbfile,"empty_zonelist2a",ZZ,1,iarr,1,0,0,0,iarr,iarr,iarr,1,OL(ol)),retval<0,retval==0); ASSERT(DBPutZonelist2(dbfile,"empty_zonelist2b",ZZ,0, 0,1,3,3,3,iarr,iarr,iarr,1,OL(ol)),retval<0,retval==0); ASSERT(DBPutZonelist2(dbfile,"empty_zonelist2c",ZZ,1,iarr,0,3,3,3, 0,iarr,iarr,1,OL(ol)),retval<0,retval==0); ASSERT(DBPutZonelist2(dbfile,"empty_zonelist2d",ZZ,1,iarr,1,0,3,0,iarr, 0,iarr,0,OL(ol)),retval<0,retval==0); ASSERT(DBPutZonelist2(dbfile,"empty_zonelist2e",ZZ,1,iarr,1,3,0,0,iarr,iarr, 0,1,OL(ol)),retval<0,retval==0); ASSERT(DBPutPHZonelist(dbfile,"empty_phzonelista",ZZ,iarr,1,iarr,cnames[0],1,iarr,1,iarr,0,0,0,OL(ol)),retval<0,retval==0); ASSERT(DBPutPHZonelist(dbfile,"empty_phzonelistb",ZZ, 0,1,iarr,cnames[0],1,iarr,1,iarr,0,0,0,OL(ol)),retval<0,retval==0); ASSERT(DBPutPHZonelist(dbfile,"empty_phzonelistc",ZZ,iarr,1, 0,cnames[0],1,iarr,1,iarr,0,0,0,OL(ol)),retval<0,retval==0); ASSERT(DBPutPHZonelist(dbfile,"empty_phzonelistd",ZZ,iarr,1,iarr, 0,1,iarr,1,iarr,0,0,0,OL(ol)),retval<0,retval==0); ASSERT(DBPutPHZonelist(dbfile,"empty_phzoneliste",ZZ,iarr,1,iarr,cnames[0],1, 0,1,iarr,0,0,0,OL(ol)),retval<0,retval==0); ASSERT(DBPutPHZonelist(dbfile,"empty_phzonelistf",ZZ,iarr,1,iarr,cnames[0],1,iarr,1, 0,0,0,0,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar(dbfile,"uva","empty_ucdmesh1",0,cnames,vars,ZZ,vars,1,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar(dbfile,"uvb","empty_ucdmesh1",1, 0,vars,ZZ,vars,1,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar(dbfile,"uvc","empty_ucdmesh1",2,cnames, 0,ZZ,vars,1,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar(dbfile,"uvd","empty_ucdmesh1",3,cnames,vars,ZZ, 0,1,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar(dbfile,"uve","empty_ucdmesh1",3, 0, 0,ZZ, 0,1,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar1(dbfile,"uv1a","empty_ucdmesh1",var,ZZ,vars[0],1,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar1(dbfile,"uv1b","empty_ucdmesh1", 0,ZZ,vars[0],1,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar1(dbfile,"uv1c","empty_ucdmesh1",var,ZZ, 0,1,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutUcdvar1(dbfile,"uv1d","empty_ucdmesh1", 0,ZZ, 0,1,dt,ct,OL(ol)),retval<0,retval==0); /* csg meshes and vars */ ASSERT(DBPutCsgmesh(dbfile,"empty_csgmesh1",2,ZZ, 0,iarr,var,1,dt,exts,"foo",OL(ol)),retval<0,retval==0); ASSERT(DBPutCsgmesh(dbfile,"empty_csgmesh2",2,ZZ,iarr, 0,var,2,dt,exts,"foo",OL(ol)),retval<0,retval==0); ASSERT(DBPutCsgmesh(dbfile,"empty_csgmesh3",3,ZZ,iarr,iarr, 0,3,dt,exts,"foo",OL(ol)),retval<0,retval==0); ASSERT(DBPutCsgmesh(dbfile,"empty_csgmesh4",3,ZZ,iarr,iarr,var,0,dt,exts,"foo",OL(ol)),retval<0,retval==0); ASSERT(DBPutCSGZonelist(dbfile,"empty_csgzonelista",0,iarr,iarr,iarr,0,0,dt,ZZ,iarr,OL(ol)),retval<0,retval==0); ASSERT(DBPutCSGZonelist(dbfile,"empty_csgzonelistb",1, 0,iarr,iarr,0,0,dt,ZZ,iarr,OL(ol)),retval<0,retval==0); ASSERT(DBPutCSGZonelist(dbfile,"empty_csgzonelistc",1,iarr, 0,iarr,0,0,dt,ZZ,iarr,OL(ol)),retval<0,retval==0); ASSERT(DBPutCSGZonelist(dbfile,"empty_csgzonelistd",1,iarr,iarr, 0,0,0,dt,ZZ,iarr,OL(ol)),retval<0,retval==0); ASSERT(DBPutCSGZonelist(dbfile,"empty_csgzoneliste",1,iarr,iarr,iarr,0,0,dt,ZZ, 0,OL(ol)),retval<0,retval==0); ASSERT(DBPutCsgvar(dbfile,"csgva","empty_csgmesh1",0,cnames,vvars,ZZ,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutCsgvar(dbfile,"csgvb","empty_csgmesh1",1, 0,vvars,ZZ,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutCsgvar(dbfile,"csgvc","empty_csgmesh1",1,cnames, 0, ZZ,dt,ct,OL(ol)),retval<0,retval==0); ASSERT(DBPutCsgvar(dbfile,"csgvd","empty_csgmesh1",1,cnames,vvars,ZZ,dt,ct,OL(ol)),retval<0,retval==0); /* empty materials and species */ ASSERT(DBPutMaterial(dbfile,"empty_mata","foo",1,iarr,iarr,ZDIMS,1,iarr,iarr,iarr,vars[0],1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMaterial(dbfile,"empty_matb","foo",1, 0,iarr,ZDIMS,1,iarr,iarr,iarr,vars[0],1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMaterial(dbfile,"empty_matc","foo",1,iarr, 0,ZDIMS,1,iarr,iarr,iarr,vars[0],1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMaterial(dbfile,"empty_matd","foo",1,iarr,iarr,ZDIMS,1, 0,iarr,iarr,vars[0],1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMaterial(dbfile,"empty_mate","foo",1,iarr,iarr,ZDIMS,1,iarr, 0,iarr,vars[0],1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMaterial(dbfile,"empty_matf","foo",1,iarr,iarr,ZDIMS,1,iarr,iarr, 0,vars[0],1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMaterial(dbfile,"empty_matg","foo",1,iarr,iarr,ZDIMS,1,iarr,iarr,iarr, 0,1,dt,OL(ol)),retval<0,retval==0); /* empty matspecies via dims[i] == 0 */ ASSERT(DBPutMatspecies(dbfile,"empty_speca","empty_mata",1,iarr,iarr,ZDIMS,1,1,var,iarr,1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMatspecies(dbfile,"empty_specb","empty_mata",1,iarr,iarr,ZDIMS,2,1,var,iarr,1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMatspecies(dbfile,"empty_specc","empty_mata",1,iarr,iarr,ZDIMS,3,1,var,iarr,1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMatspecies(dbfile,"empty_specd","empty_mata",1,iarr,iarr,ZDIMS,1,1, 0,iarr,1,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMatspecies(dbfile,"empty_spece","empty_mata",1,iarr,iarr,ZDIMS,1,1,var, 0,0,dt,OL(ol)),retval<0,retval==0); /* empty matspeces via nspecies_mf==0 */ { int nd=2, d[2]={3,2}, slm[6]={0,0,-1,-3,0,0}, ml=4, msl[4]={1,2,1,2}, slc[6]={0,0,0,0,0,0}; ASSERT(DBPutMatspecies(dbfile,"empty_specf","empty_mata",1,iarr,slc,d,nd,ZZ,var, 0, 0,dt,OL(ol)),retval<0,retval==0); ASSERT(DBPutMatspecies(dbfile,"empty_specg","empty_mata",1,iarr,slm,d,nd,ZZ,var,msl,ml,dt,OL(ol)),retval<0,retval==0); } } DBClose(dbfile); dbfile = 0; /* Ok, now try to read each empty object to make sure we get what we expect and nothing fails */ dbfile = DBOpen(filename, DB_UNKNOWN, DB_READ); /* test read back of empty curves */ { int i=0; char *cnames[] = {"empty_curvea", "empty_curveb", "empty_curvec", 0}; DBSetDir(dbfile, "DBPutCurve"); while (cnames[i]) { DBcurve *curve = DBGetCurve(dbfile, cnames[i++]); assert(DBIsEmptyCurve(curve)); DBFreeCurve(curve); } DBSetDir(dbfile, ".."); } /* test read back of empty point meshes and vars */ { int i=0; char *pmnames[] = {"empty_pointmesha", "empty_pointmeshb", 0}; DBSetDir(dbfile, "DBPutPointmesh"); while (pmnames[i]) { DBpointmesh *pointmesh = DBGetPointmesh(dbfile, pmnames[i++]); assert(DBIsEmptyPointmesh(pointmesh)); DBFreePointmesh(pointmesh); } DBSetDir(dbfile, ".."); } { int i=0; char *vnames[] = {"pva", "pvb", "pv1a", "pv1b", 0}; DBSetDir(dbfile, "DBPutPointvar"); while (vnames[i]) { DBpointvar *pointvar = DBGetPointvar(dbfile, vnames[i++]); assert(DBIsEmptyPointvar(pointvar)); DBFreePointvar(pointvar); } DBSetDir(dbfile, ".."); } /* test read back of empty quad meshes and vars */ { int i=0; char *qmnames[] = {"empty_quadmesha", "empty_quadmeshb", "empty_quadmeshc", 0}; DBSetDir(dbfile, "DBPutQuadmesh"); while (qmnames[i]) { DBquadmesh *quadmesh = DBGetQuadmesh(dbfile, qmnames[i++]); assert(DBIsEmptyQuadmesh(quadmesh)); DBFreeQuadmesh(quadmesh); } DBSetDir(dbfile, ".."); } { int i=0; char *vnames[] = {"qva" , "qvb", "qv1a", "qv1b", 0}; DBSetDir(dbfile, "DBPutQuadvar"); while (vnames[i]) { DBquadvar *quadvar = DBGetQuadvar(dbfile, vnames[i++]); assert(DBIsEmptyQuadvar(quadvar)); DBFreeQuadvar(quadvar); } DBSetDir(dbfile, ".."); } /* test read back of empty ucd meshes, zonelists and vars */ { int i=0; char *mnames[] = {"empty_ucdmesh1", "empty_ucdmesh2", "empty_ucdmesh3", 0}; DBSetDir(dbfile, "DBPutUcdmesh"); while (mnames[i]) { DBucdmesh *ucdmesh = DBGetUcdmesh(dbfile, mnames[i++]); assert(DBIsEmptyUcdmesh(ucdmesh)); DBFreeUcdmesh(ucdmesh); } DBSetDir(dbfile, ".."); } { int i=0; char *flnames[] = {"empty_facelista", "empty_facelistb", "empty_facelistc", "empty_facelistd", "empty_faceliste", "empty_facelistf", "empty_facelistg", 0}; DBSetDir(dbfile, "DBPutFacelist"); while (flnames[i]) { DBfacelist *fl = DBGetFacelist(dbfile, flnames[i++]); assert(DBIsEmptyFacelist(fl)); DBFreeFacelist(fl); } DBSetDir(dbfile, ".."); } { int i=0; char *zlnames[] = {"empty_zonelista", "empty_zonelistb", "empty_zonelistc", "empty_zonelistd", "empty_zonelist2a", "empty_zonelist2b", "empty_zonelist2c", "empty_zonelist2d", "empty_zonelist2e", 0}; DBSetDir(dbfile, "DBPutZonelist"); while (zlnames[i]) { DBzonelist *zl = DBGetZonelist(dbfile, zlnames[i++]); assert(DBIsEmptyZonelist(zl)); DBFreeZonelist(zl); } DBSetDir(dbfile, ".."); } { int i=0; char *zlnames[] = {"empty_phzonelista", "empty_phzonelistb", "empty_phzonelistc", "empty_phzonelistd", "empty_phzoneliste", "empty_phzonelistf", 0}; DBSetDir(dbfile, "DBPutPHZonelist"); while (zlnames[i]) { DBphzonelist *zl = DBGetPHZonelist(dbfile, zlnames[i++]); assert(DBIsEmptyPHZonelist(zl)); DBFreePHZonelist(zl); } DBSetDir(dbfile, ".."); } { int i=0; char *vnames[] = { "uva", "uvb", "uvc", "uvd", "uve", "uv1a", "uv1b", "uv1c", "uv1d", 0}; DBSetDir(dbfile, "DBPutUcdvar"); while (vnames[i]) { DBucdvar *ucdvar = DBGetUcdvar(dbfile, vnames[i++]); assert(DBIsEmptyUcdvar(ucdvar)); DBFreeUcdvar(ucdvar); } DBSetDir(dbfile, ".."); } /* test read back of empty csg meshes and vars */ { int i=0; char *mnames[] = {"empty_csgmesh1", "empty_csgmesh2", "empty_csgmesh3", 0}; DBSetDir(dbfile, "DBPutCsgmesh"); while (mnames[i]) { DBcsgmesh *csgmesh = DBGetCsgmesh(dbfile, mnames[i++]); assert(DBIsEmptyCsgmesh(csgmesh)); DBFreeCsgmesh(csgmesh); } DBSetDir(dbfile, ".."); } { int i=0; char *zlnames[] = {"empty_csgzonelista", "empty_csgzonelistb", "empty_csgzonelistc", "empty_csgzonelistd", "empty_csgzoneliste", 0}; DBSetDir(dbfile, "DBPutCSGZonelist"); while (zlnames[i]) { DBcsgzonelist *zl = DBGetCSGZonelist(dbfile, zlnames[i++]); assert(DBIsEmptyCSGZonelist(zl)); DBFreeCSGZonelist(zl); } DBSetDir(dbfile, ".."); } { int i=0; char *vnames[] = {"csgva", "csgvb", "csgvc", "csgvd", 0}; DBSetDir(dbfile, "DBPutCsgvar"); while (vnames[i]) { DBcsgvar *csgvar = DBGetCsgvar(dbfile, vnames[i++]); assert(DBIsEmptyCsgvar(csgvar)); DBFreeCsgvar(csgvar); } DBSetDir(dbfile, ".."); } /* test read back of empty materials and matspecies */ { int i=0; char *vnames[] = {"empty_mata", "empty_matb", "empty_matc", "empty_matd", "empty_mate", "empty_matf", "empty_matg", 0}; DBSetDir(dbfile, "DBPutMaterial"); while (vnames[i]) { DBmaterial *mat = DBGetMaterial(dbfile, vnames[i++]); assert(DBIsEmptyMaterial(mat)); DBFreeMaterial(mat); } DBSetDir(dbfile, ".."); } { int i=0; char *vnames[] = {"empty_speca", "empty_specb", "empty_specc", "empty_specd", "empty_spece", "empty_specf", "empty_specg", 0}; DBSetDir(dbfile, "DBPutMatspecies"); while (vnames[i]) { DBmatspecies *spec = DBGetMatspecies(dbfile, vnames[i++]); assert(DBIsEmptyMatspecies(spec)); DBFreeMatspecies(spec); } DBSetDir(dbfile, ".."); } DBClose(dbfile); CleanupDriverStuff(); return 0; }
/*---------------------------------------------------------------------------- * Function: domatspec * * Inputs: db (DBfile*): the Silo file handle * * Returns: (void) * * Abstract: Write the material and species info stored in the global Mesh * to the Silo file. Handle mixed zones properly for both. * * Modifications: * Sean Ahern, Wed Feb 6 16:32:35 PST 2002 * Added material names. *---------------------------------------------------------------------------*/ int domatspec(DBfile *db, DoSpecOp_t writeOrReadAndCheck, int forceSingle) { int x, y, c; int dims[2]; int matlist[1000]; int mix_mat[1000]; int mix_zone[1000]; int mix_next[1000]; float mix_vf[1000]; double mix_vfd[1000]; int mixc; int mfc; int speclist[1000]; int mixspeclist[1000]; float specmf[10000]; double specmfd[10000]; DBoptlist *optlist; dims[0] = mesh.zx; dims[1] = mesh.zy; /* do Materials */ c = 0; mixc = 0; for (x = 0; x < mesh.zx; x++) { for (y = 0; y < mesh.zy; y++) { int nmats = mesh.zone[x][y].nmats; if (nmats == 1) { /* clean zone */ int m = -1; int i; for (i = 1; i <= nmat; i++) if (mesh.zone[x][y].matvf[i] > 0) m = i; if (m < 0) { printf("Internal error!\n"); exit(-1); }; matlist[c] = m; c++; } else { /* mixed zone */ int m = 0; matlist[c] = -mixc - 1; for (m = 1; m <= nmat && nmats > 0; m++) { if (mesh.zone[x][y].matvf[m] > 0) { mix_mat[mixc] = m; mix_vf[mixc] = mesh.zone[x][y].matvf[m]; mix_vfd[mixc] = mesh.zone[x][y].matvfd[m]; mix_zone[mixc] = c + 1; /* 1-origin */ nmats--; if (nmats) mix_next[mixc] = mixc + 2; /* next + 1-origin */ else mix_next[mixc] = 0; mixc++; } } c++; } } } if (writeOrReadAndCheck == doWrite) { optlist = DBMakeOptlist(10); DBAddOption(optlist, DBOPT_MATNAMES, matnames); DBPutMaterial(db, "Material", "Mesh", nmat, matnos, matlist, dims, 2, mix_next, mix_mat, mix_zone, mix_vf, mixc, DB_FLOAT, optlist); DBPutMaterial(db, "Materiald", "Mesh", nmat, matnos, matlist, dims, 2, mix_next, mix_mat, mix_zone, mix_vfd, mixc, DB_DOUBLE, optlist); } else /* doReadAndCheck */ { int pass; for (pass = 0; pass < 2; pass++) { DBmaterial *mat = DBGetMaterial(db, pass?"Material":"Materiald"); CHECKIVAL(mat->nmat, nmat); CHECKIARR(mat->matnos, matnos, nmat); CHECKIVAL(mat->ndims, 2); CHECKIARR(mat->dims, dims, 2); if (forceSingle) { CHECKIVAL(mat->datatype, DB_FLOAT); } else { CHECKIVAL(mat->datatype, pass?DB_FLOAT:DB_DOUBLE); } CHECKIVAL(mat->mixlen, mixc); CHECKIARR(mat->matlist, matlist, dims[0]*dims[1]); CHECKIARR(mat->mix_next, mix_next, mixc); CHECKIARR(mat->mix_mat, mix_mat, mixc); CHECKIARR(mat->mix_zone, mix_zone, mixc); if (forceSingle) { CHECKDARR(((float*)mat->mix_vf), mix_vf, mixc); } else if (pass) { CHECKDARR(((float*)mat->mix_vf), mix_vf, mixc); } else { CHECKDARR(((double*)mat->mix_vf), mix_vfd, mixc); } } } /* Okay! Now for the species! */ c = 0; mixc = 0; mfc = 0; for (x = 0; x < mesh.zx; x++) { for (y = 0; y < mesh.zy; y++) { if (mesh.zone[x][y].nmats == 1) { int m = -1; int i, s; for (i = 1; i <= nmat; i++) if (mesh.zone[x][y].matvf[i] > 0) m = i; if (m < 0) { printf("Internal error!\n"); exit(-1); }; if (nspec[m - 1] == 1) { speclist[c] = 0; /* no mf for this mat: only 1 species */ } else { speclist[c] = mfc + 1; /* 1-origin */ for (s = 0; s < nspec[m - 1]; s++) { specmf[mfc] = mesh.zone[x][y].specmf[m][s]; specmfd[mfc] = mesh.zone[x][y].specmfd[m][s]; mfc++; } } c++; } else { int m; speclist[c] = -mixc - 1; for (m = 1; m <= nmat; m++) { if (mesh.zone[x][y].matvf[m] > 0) { if (nspec[m - 1] == 1) { mixspeclist[mixc] = 0; /* no mf for this mat: * only 1 species */ } else { int s; mixspeclist[mixc] = mfc + 1; /* 1-origin */ for (s = 0; s < nspec[m - 1]; s++) { specmf[mfc] = mesh.zone[x][y].specmf[m][s]; specmfd[mfc] = mesh.zone[x][y].specmfd[m][s]; mfc++; } } mixc++; } } c++; } } } if (writeOrReadAndCheck == doWrite) { DBClearOptlist(optlist); DBAddOption(optlist, DBOPT_SPECNAMES, specnames); DBAddOption(optlist, DBOPT_SPECCOLORS, speccolors); DBPutMatspecies(db, "Species", "Material", nmat, nspec, speclist, dims, 2, mfc, specmf, mixspeclist, mixc, DB_FLOAT, optlist); DBPutMatspecies(db, "Speciesd", "Materiald", nmat, nspec, speclist, dims, 2, mfc, specmfd, mixspeclist, mixc, DB_DOUBLE, optlist); DBFreeOptlist(optlist); } else /* doReadAndCheck */ { int pass; for (pass = 0; pass < 2; pass++) { DBmatspecies *spec = DBGetMatspecies(db, pass?"Species":"Speciesd"); CHECKIVAL(spec->nmat, nmat); CHECKIARR(spec->nmatspec, nspec, nmat); CHECKIVAL(spec->ndims, 2); CHECKIARR(spec->dims, dims, 2); if (forceSingle) { CHECKIVAL(spec->datatype, DB_FLOAT); } else { CHECKIVAL(spec->datatype, pass?DB_FLOAT:DB_DOUBLE); } CHECKIVAL(spec->mixlen, mixc); CHECKIVAL(spec->nspecies_mf, mfc); CHECKIARR(spec->speclist, speclist, dims[0]*dims[1]); CHECKIARR(spec->mix_speclist, mixspeclist, mixc); if (forceSingle) { CHECKDARR(((float*)spec->species_mf), specmf, mfc); } else if (pass) { CHECKDARR(((float*)spec->species_mf), specmf, mfc); } else { CHECKDARR(((double*)spec->species_mf), specmfd, mfc); } } } return mixc; }
/*------------------------------------------------------------------------- * Function: build_dbfile * * Purpose: Make a multi-block mesh, multi-block variables, and a * multi-block material * * Return: Success: 0 * Failure: -1 * * Programmer: Jeremy Meredith, Sept 29, 1998 * * Modifications: * *------------------------------------------------------------------------*/ int build_dbfile(DBfile *dbfile) { /* multiblock data */ int nblocks_x=5; int nblocks_y=1; int nblocks = nblocks_x * nblocks_y; char *meshnames[MAXBLOCKS]; int meshtypes[MAXBLOCKS]; char names[7][MAXBLOCKS][STRLEN]; char *varnames[4][MAXBLOCKS]; int vartypes[MAXBLOCKS]; char *matnames[MAXBLOCKS]; char *specnames[MAXBLOCKS]; char dirnames[MAXBLOCKS][STRLEN]; char *meshname, *varname[4], *matname; /* mesh data */ int meshtype=DB_QUADMESH; int vartype=DB_QUADVAR; int coord_type=DB_NONCOLLINEAR; char *coordnames[3]; int ndims; int dims[3], zdims[3]; float *coords[3]; float x[(NX + 1) * (NY + 1)], y[(NX + 1) * (NY + 1)]; /* variables data */ float d[NX * NY], p[NX * NY], u[(NX + 1) * (NY + 1)], v[(NX + 1) * (NY + 1)]; int usespecmf=1; /* (multi)material data */ int nmats; int matnos[3]; int matlist[NX * NY]; /* (multi)species data */ char *specname; int speclist[NX*NY],speclist2[NX*NY]; float species_mf[NX*NY*5]; int nspecies_mf; int nmatspec[3]; /* time data */ int cycle; float time; double dtime; /* option list */ DBoptlist *optlist; /* internal data */ int i, j; float xave, yave; float xcenter, ycenter; float theta, dtheta; float r, dr; float dist; int block; int delta_x, delta_y; int base_x, base_y; int n_x, n_y; /* single block data */ float x2[(NX + 1) * (NY + 1)], y2[(NX + 1) * (NY + 1)]; float d2[NX * NY], p2[NX * NY], u2[(NX + 1) * (NY + 1)], v2[(NX + 1) * (NY + 1)]; int matlist2[NX * NY]; int dims2[3]; /* * Initialize the names and create the directories for the blocks. */ for (i = 0; i < nblocks; i++) { sprintf(names[6][i], "/block%d/mesh1", i); meshnames[i] = names[6][i]; meshtypes[i] = meshtype; sprintf(names[0][i], "/block%d/d", i); sprintf(names[1][i], "/block%d/p", i); sprintf(names[2][i], "/block%d/u", i); sprintf(names[3][i], "/block%d/v", i); varnames[0][i] = names[0][i]; varnames[1][i] = names[1][i]; varnames[2][i] = names[2][i]; varnames[3][i] = names[3][i]; vartypes[i] = vartype; sprintf(names[4][i], "/block%d/mat1", i); matnames[i] = names[4][i]; sprintf(names[5][i], "/block%d/species1",i); specnames[i]= names[5][i]; /* make the directory for the block mesh */ sprintf(dirnames[i], "/block%d", i); if (DBMkDir(dbfile, dirnames[i]) == -1) { fprintf(stderr, "Could not make directory \"%s\"\n", dirnames[i]); return (-1); } /* if */ } /* for */ /* * Initalize species info */ specname = "species1"; nmatspec[0]=3; nmatspec[1]=1; nmatspec[2]=2; /* * Initialize time info */ cycle = 48; time = 4.8; dtime = 4.8; /* * Create the mesh. */ meshname = "mesh1"; coordnames[0] = "xcoords"; coordnames[1] = "ycoords"; coordnames[2] = "zcoords"; coords[0] = x; coords[1] = y; ndims = 2; dims[0] = NX + 1; dims[1] = NY + 1; dtheta = (180. / NX) * (3.1415926 / 180.); dr = 3. / NY; theta = 0; for (i = 0; i < NX + 1; i++) { r = 2.; for (j = 0; j < NY + 1; j++) { x[j * (NX + 1) + i] = r * cos(theta); y[j * (NX + 1) + i] = r * sin(theta); r += dr; } theta += dtheta; } /* * Create the density and pressure arrays. */ varname[0] = "d"; varname[1] = "p"; xcenter = 0.; ycenter = 0.; zdims[0] = NX; zdims[1] = NY; for (i = 0; i < NX; i++) { for (j = 0; j < NY; j++) { xave = (x[(j) * (NX + 1) + i] + x[(j) * (NX + 1) + i + 1] + x[(j + 1) * (NX + 1) + i + 1] + x[(j + 1) * (NX + 1) + i]) / 4.; yave = (y[(j) * (NX + 1) + i] + y[(j) * (NX + 1) + i + 1] + y[(j + 1) * (NX + 1) + i + 1] + y[(j + 1) * (NX + 1) + i]) / 4.; dist = sqrt((xave - xcenter) * (xave - xcenter) + (yave - ycenter) * (yave - ycenter)); d[j * NX + i] = dist*((float)i/(float)NX); p[j * NX + i] = 1. / (dist + .0001); } } /* * Create the velocity component arrays. Note that the indexing * on the x and y coordinates is for rectilinear meshes. It * generates a nice vector field. */ varname[2] = "u"; varname[3] = "v"; xcenter = 0.; ycenter = 0.; for (i = 0; i < NX + 1; i++) { for (j = 0; j < NY + 1; j++) { dist = sqrt((x[i] - xcenter) * (x[i] - xcenter) + (y[j] - ycenter) * (y[j] - ycenter)); u[j * (NX + 1) + i] = (x[i] - xcenter) / dist; v[j * (NX + 1) + i] = (y[j] - ycenter) / dist; } } /* * Create the material array. */ matname = "mat1"; nmats = 3; matnos[0] = 1; matnos[1] = 2; matnos[2] = 3; dims2[0] = NX; dims2[1] = NY; /* * Put in the material in 3 shells. */ nspecies_mf=0; for (i = 0; i < NX; i++) { for (j = 0; j < 10; j++) { matlist[j * NX + i] = 1; speclist[j*NX+i]=nspecies_mf+1; if (i<10) { species_mf[nspecies_mf++]=.2; species_mf[nspecies_mf++]=.3; species_mf[nspecies_mf++]=.5; } else { species_mf[nspecies_mf++]=.9; species_mf[nspecies_mf++]=.1; species_mf[nspecies_mf++]=.0; } } for (j = 10; j < 20; j++) { matlist[j * NX + i] = 2; speclist[j*NX+i]=nspecies_mf+1; species_mf[nspecies_mf++]=1.; } for (j = 20; j < NY; j++) { matlist[j * NX + i] = 3; speclist[j*NX+i]=nspecies_mf+1; if (i<20) { species_mf[nspecies_mf++]=.3; species_mf[nspecies_mf++]=.7; } else { species_mf[nspecies_mf++]=.9; species_mf[nspecies_mf++]=.1; } } } delta_x = NX / nblocks_x; delta_y = NY / nblocks_y; coords[0] = x2; coords[1] = y2; dims[0] = delta_x + 1; dims[1] = delta_y + 1; zdims[0] = delta_x; zdims[1] = delta_y; dims2[0] = delta_x; dims2[1] = delta_y; /* * Create the blocks for the multi-block object. */ for (block = 0; block < nblocks_x * nblocks_y; block++) { fprintf(stdout, "\t%s\n", dirnames[block]); /* * Now extract the data for this block. */ base_x = (block % nblocks_x) * delta_x; base_y = (block / nblocks_x) * delta_y; for (j = 0, n_y = base_y; j < delta_y + 1; j++, n_y++) for (i = 0, n_x = base_x; i < delta_x + 1; i++, n_x++) { x2[j * (delta_x + 1) + i] = x[n_y * (NX + 1) + n_x]; y2[j * (delta_x + 1) + i] = y[n_y * (NX + 1) + n_x]; u2[j * (delta_x + 1) + i] = u[n_y * (NX + 1) + n_x]; v2[j * (delta_x + 1) + i] = v[n_y * (NX + 1) + n_x]; } for (j = 0, n_y = base_y; j < delta_y; j++, n_y++) for (i = 0, n_x = base_x; i < delta_x; i++, n_x++) { d2[j * delta_x + i] = d[n_y * NX + n_x]; p2[j * delta_x + i] = p[n_y * NX + n_x]; matlist2[j * delta_x + i] = matlist[n_y * NX + n_x]; speclist2[j*delta_x+i]=speclist[n_y*NX+n_x]; } if (DBSetDir(dbfile, dirnames[block]) == -1) { fprintf(stderr, "Could not set directory \"%s\"\n", dirnames[block]); return -1; } /* if */ /* Write out the variables. */ optlist = DBMakeOptlist(10); DBAddOption(optlist, DBOPT_CYCLE, &cycle); DBAddOption(optlist, DBOPT_TIME, &time); DBAddOption(optlist, DBOPT_DTIME, &dtime); DBAddOption(optlist, DBOPT_XLABEL, "X Axis"); DBAddOption(optlist, DBOPT_YLABEL, "Y Axis"); DBAddOption(optlist, DBOPT_XUNITS, "cm"); DBAddOption(optlist, DBOPT_YUNITS, "cm"); DBPutQuadmesh(dbfile, meshname, coordnames, coords, dims, ndims, DB_FLOAT, DB_NONCOLLINEAR, optlist); DBPutQuadvar1(dbfile, varname[2], meshname, u2, dims, ndims, NULL, 0, DB_FLOAT, DB_NODECENT, optlist); DBPutQuadvar1(dbfile, varname[3], meshname, v2, dims, ndims, NULL, 0, DB_FLOAT, DB_NODECENT, optlist); DBAddOption(optlist, DBOPT_USESPECMF, &usespecmf); DBPutQuadvar1(dbfile, varname[0], meshname, d2, zdims, ndims, NULL, 0, DB_FLOAT, DB_ZONECENT, optlist); DBPutQuadvar1(dbfile, varname[1], meshname, p2, zdims, ndims, NULL, 0, DB_FLOAT, DB_ZONECENT, optlist); DBPutMaterial(dbfile, matname, meshname, nmats, matnos, matlist2, dims2, ndims, NULL, NULL, NULL, NULL, 0, DB_FLOAT, optlist); DBPutMatspecies(dbfile, specname, matname, nmats, nmatspec, speclist2, dims2, ndims, nspecies_mf, species_mf, NULL, 0, DB_FLOAT, optlist); DBFreeOptlist(optlist); if (DBSetDir(dbfile, "..") == -1) { fprintf(stderr, "Could not return to base directory\n"); return -1; } /* if */ } /* for */ /* create the option lists for the multi-block calls. */ optlist = DBMakeOptlist(10); /* For all calls: */ DBAddOption(optlist, DBOPT_CYCLE, &cycle); DBAddOption(optlist, DBOPT_TIME, &time); DBAddOption(optlist, DBOPT_DTIME, &dtime); /* For multi-materials: */ DBAddOption(optlist, DBOPT_NMATNOS, &nmats); DBAddOption(optlist, DBOPT_MATNOS, matnos); /* For multi-species: */ DBAddOption(optlist, DBOPT_MATNAME, "mat1"); DBAddOption(optlist, DBOPT_NMAT, &nmats); DBAddOption(optlist, DBOPT_NMATSPEC, nmatspec); DBAddOption(optlist, DBOPT_SPECNAMES, species_names); DBAddOption(optlist, DBOPT_SPECCOLORS, speccolors); /* create the multi-block mesh */ if (DBPutMultimesh(dbfile, "mesh1", nblocks, meshnames, meshtypes, optlist) == -1) { DBFreeOptlist(optlist); fprintf(stderr, "Error creating multi mesh\n"); return (-1); } /* if */ /* create the multi-block variables */ if (DBPutMultivar(dbfile, "d", nblocks, varnames[0], vartypes, optlist) == -1) { DBFreeOptlist(optlist); fprintf(stderr, "Error creating multi var d\n"); return (-1); } /* if */ if (DBPutMultivar(dbfile, "p", nblocks, varnames[1], vartypes, optlist) == -1) { DBFreeOptlist(optlist); fprintf(stderr, "Error creating multi var p\n"); return (-1); } /* if */ if (DBPutMultivar(dbfile, "u", nblocks, varnames[2], vartypes, optlist) == -1) { DBFreeOptlist(optlist); fprintf(stderr, "Error creating multi var u\n"); return (-1); } /* if */ if (DBPutMultivar(dbfile, "v", nblocks, varnames[3], vartypes, optlist) == -1) { DBFreeOptlist(optlist); fprintf(stderr, "Error creating multi var v\n"); return (-1); } /* if */ /* create the multi-block material */ if (DBPutMultimat(dbfile, "mat1", nblocks, matnames, optlist) == -1) { DBFreeOptlist(optlist); fprintf(stderr, "Error creating multi material\n"); return (-1); } /* if */ /* create the multi-block species */ if (DBPutMultimatspecies(dbfile, "species1", nblocks, specnames, optlist) == -1) { DBFreeOptlist(optlist); fprintf(stderr, "Error creating multi species\n"); return (-1); } /* if */ DBFreeOptlist(optlist); return (0); }
/*---------------------------------------------------------------------- * Routine build_quad * * Purpose * * Build quad-mesh, quad-var, and material data objects; return * the mesh ID. * * Arguments * name Name to assign mesh. * * Modifications * * Lisa J. Roberts, Fri Apr 7 09:35:52 PDT 2000 * Changed the prototype to ANSI standard and explicitly indicated * the function returns an int. Got rid of varid and matid, which * were unused. * *--------------------------------------------------------------------*/ int build_quad(DBfile *dbfile, char *name) { int i, dims[3], zones[3], ndims, cycle, meshid; float time; double dtime; int zdims[3]; float x[10], y[8], d[80], *coords[3], *vars[3]; float u[80], v[80]; int matnos[3], matlist[63], nmat, mixlen; char *coordnames[3], *varnames[3]; DBoptlist *optlist; optlist = DBMakeOptlist(10); DBAddOption(optlist, DBOPT_CYCLE, &cycle); DBAddOption(optlist, DBOPT_TIME, &time); DBAddOption(optlist, DBOPT_DTIME, &dtime); ndims = 2; dims[0] = 10; dims[1] = 8; zones[0] = 9; zones[1] = 7; cycle = 44; time = 4.4; dtime = 4.4; coords[0] = x; coords[1] = y; coordnames[0] = "xcoords"; coordnames[1] = "ycoords"; for (i = 0; i < dims[0]; i++) x[i] = (float)i; for (i = 0; i < dims[1]; i++) y[i] = (float)i + .1; meshid = DBPutQuadmesh(dbfile, name, coordnames, coords, dims, ndims, DB_FLOAT, DB_COLLINEAR, optlist); varnames[0] = "d"; vars[0] = d; zdims[0] = dims[0] - 1; zdims[1] = dims[1] - 1; for (i = 0; i < zdims[0] * zdims[1]; i++) d[i] = (float)i *.2; (void)DBPutQuadvar1(dbfile, "d", name, d, zdims, ndims, NULL, 0, DB_FLOAT, DB_ZONECENT, optlist); for (i = 0; i < dims[0] * dims[1]; i++) { u[i] = (float)i *.1; v[i] = (float)i *.1; } (void)DBPutQuadvar1(dbfile, "ucomp", name, u, dims, ndims, NULL, 0, DB_FLOAT, DB_NODECENT, optlist); (void)DBPutQuadvar1(dbfile, "vcomp", name, v, dims, ndims, NULL, 0, DB_FLOAT, DB_NODECENT, optlist); vars[0] = u; vars[1] = v; varnames[0] = "u"; varnames[1] = "v"; (void)DBPutQuadvar(dbfile, "velocity", name, 2, varnames, vars, dims, ndims, NULL, 0, DB_FLOAT, DB_NODECENT, optlist); /* * Build material data. */ nmat = 3; mixlen = 0; matnos[0] = 1; matnos[1] = 2; matnos[2] = 3; for (i = 0; i < 27; i++) matlist[i] = 1; for (i = 27; i < 45; i++) matlist[i] = 2; for (i = 45; i < 63; i++) matlist[i] = 3; (void)DBPutMaterial(dbfile, "material", name, nmat, matnos, matlist, zones, ndims, NULL, NULL, NULL, NULL, mixlen, DB_FLOAT, NULL); return (meshid); }
/*---------------------------------------------------------------------- * Routine build_ucd3 * * Purpose * * Build in 3D a ucd-mesh, ucd-var, facelist and zonelist, and return * the mesh ID. * * Arguments * name Name to assign mesh. * * Modifications * * Lisa J. Roberts, Fri Apr 7 09:35:52 PDT 2000 * Changed the prototype to ANSI standard and explicitly indicated * the function returns an int. Got rid of flid, zlid, varid, i, * dfnew, dbid, ln, and matid, which were unused. * *--------------------------------------------------------------------*/ int build_ucd3(DBfile *dbfile, char *name) { #undef NZONES #define NZONES 3 #undef NFACES #define NFACES 14 #undef NNODES #define NNODES 16 #undef MAXMIX #define MAXMIX 12 #undef MAXOMIX #define MAXOMIX 4 #undef NZSHAPES #define NZSHAPES 1 #undef NFSHAPES #define NFSHAPES 1 #undef NFTYPES #define NFTYPES 0 #undef LZNODELIST #define LZNODELIST 24 #undef LFNODELIST #define LFNODELIST 56 /*---------------------------------------------------------------------- The test mesh looks like this: *---------------------------------------------------------------------*/ int meshid; static float x[NNODES] = {0., 1., 1., 0., 0., 1., 1., 0., 0., 1., 1., 0., 0., 1., 1., 0.}; static float y[NNODES] = {0., 0., 0., 0., 1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.}; static float z[NNODES] = {0., 0., 1., 1., 0., 0., 1., 1., 0., 0., 1., 1., 0., 0., 1., 1.}; static float u[NNODES] = {0., 0., 0., 0., .1, .1, .1, .1, .2, .2, .2, .2, .3, .3, .3, .3}; static float v[NNODES] = {0., 0., 0., 0., .1, .1, .1, .1, .2, .2, .2, .2, .3, .3, .3, .3}; static float w[NNODES] = {0., 0., 0., 0., .1, .1, .1, .1, .2, .2, .2, .2, .3, .3, .3, .3}; static float d[NZONES] = {2., 4., 6.}; #if 0 static float df[MAXOMIX] = {.58, .78, .42, .22}; static float vf[MAXOMIX] = {.4, .45, .6, .55}; #endif static int matlist[NZONES] = {1, 1, 2}; static int matnos[2] = {1, 2}; #if 0 static int fzoneno[NFACES]; static int fnodelist[LFNODELIST] = {0, 1, 5, 4, 1, 2, 6, 5, 3, 2, 7, 6, 3, 0, 4, 7, 4, 5, 9, 8, 6, 5, 9, 10, 7, 6, 10, 11, 4, 7, 11, 8, 8, 9, 13, 12, 10, 9, 13, 14, 11, 10, 14, 15, 11, 15, 12, 8, 0, 1, 2, 3, 12, 13, 14, 15}; #endif static int znodelist[LZNODELIST] = {0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 9, 10, 11, 8, 9, 10, 11, 12, 13, 14, 15}; #if 0 int fshapesize, fshapecnt; #endif int zshapesize, zshapecnt; int idatatype; int dims; #if 0 double ttime = 2.345; int tcycle = 200; int mixlen = MAXMIX; #endif float *coords[3], *vars[3]; char *coordnames[3], *varnames[3]; DBfacelist *fl; #if 0 int inode, iface, izone, ifl, izl; int nface = 0; #endif int inode, izone, izl; #if 0 fshapesize = 4; fshapecnt = NFACES; #endif zshapesize = 8; zshapecnt = NZONES; idatatype = DB_FLOAT; dims = NZONES; coords[0] = x; coords[1] = y; coords[2] = z; coordnames[0] = "X"; coordnames[1] = "Y"; coordnames[2] = "Z"; vars[0] = d; varnames[0] = "d"; inode = 0; for (izone = 0; izone == NZONES; izone++) { x[inode++] = 0.; x[inode++] = 1.; x[inode++] = 1.; x[inode++] = 0.; inode -= 4; y[inode++] = (float)izone; y[inode++] = (float)izone; y[inode++] = (float)izone; y[inode++] = (float)izone; inode -= 4; z[inode++] = 0.; z[inode++] = 0.; z[inode++] = 1.; z[inode++] = 1.; } izl = 0; for (izone = 0; izone < NZONES; izone++) { for (inode = 0; inode < 4; inode++) { znodelist[izl++] = izone * 4 + inode; } for (inode = 0; inode < 4; inode++) { znodelist[izl++] = (izone + 1) * 4 + inode; } } #if 0 ifl = 0; for (izone = 0; izone < NZONES; izone++) { for (iface = 0; iface < 3; iface++) { fnodelist[ifl++] = izone * 4 + iface; fnodelist[ifl++] = izone * 4 + iface + 1; fnodelist[ifl++] = izone * 4 + iface + 5; fnodelist[ifl++] = izone * 4 + iface + 4; } fnodelist[ifl++] = izone * 4 + 3; fnodelist[ifl++] = izone * 4; fnodelist[ifl++] = izone * 4 + 4; fnodelist[ifl++] = izone * 4 + 7; for (iface = 0; iface < 4; iface++) fzoneno[nface++] = izone; } fnodelist[ifl++] = 0; fnodelist[ifl++] = 1; fnodelist[ifl++] = 2; fnodelist[ifl++] = 3; fzoneno[nface++] = 0; fnodelist[ifl++] = 12; fnodelist[ifl++] = 13; fnodelist[ifl++] = 14; fnodelist[ifl++] = 15; fzoneno[nface++] = NZONES - 1; #endif /* Last parameter was added by Sean Ahern - * Tue Aug 30 17:55:22 PDT 1994 * It is the boundary method. Arbitraryily chosen as 0 */ fl = (DBfacelist *) DBCalcExternalFacelist(znodelist, NNODES, 1, &zshapesize, &zshapecnt, NZSHAPES, matlist, 0); (void)DBPutFacelist(dbfile, "fl", fl->nfaces, 3, fl->nodelist, fl->lnodelist, 0, fl->zoneno, fl->shapesize, fl->shapecnt, fl->nshapes, NULL, NULL, 0); /* * flid = DBPutFacelist (dbfile, "fl", NFACES, 3, fnodelist, LFNODELIST, 0, * fzoneno, &fshapesize, &fshapecnt, NFSHAPES, * NULL, NULL, 0); */ (void)DBPutZonelist(dbfile, "zl", NZONES, 3, znodelist, LZNODELIST, 0, &zshapesize, &zshapecnt, NZSHAPES); meshid = DBPutUcdmesh(dbfile, name, 3, coordnames, coords, NNODES, NZONES, "zl", "fl", DB_FLOAT, NULL); (void)DBPutMaterial(dbfile, "material", name, 2, matnos, matlist, &dims, 1, NULL, NULL, NULL, NULL, 0, DB_FLOAT, NULL); vars[0] = d; varnames[0] = "d"; (void)DBPutUcdvar(dbfile, varnames[0], name, 1, varnames, vars, NZONES, NULL, 0, idatatype, DB_ZONECENT, NULL); vars[0] = u; varnames[0] = "u"; (void)DBPutUcdvar(dbfile, varnames[0], name, 1, varnames, vars, NNODES, NULL, 0, idatatype, DB_NODECENT, NULL); vars[0] = v; varnames[0] = "v"; (void)DBPutUcdvar(dbfile, varnames[0], name, 1, varnames, vars, NNODES, NULL, 0, idatatype, DB_NODECENT, NULL); vars[0] = w; varnames[0] = "w"; (void)DBPutUcdvar(dbfile, varnames[0], name, 1, varnames, vars, NNODES, NULL, 0, idatatype, DB_NODECENT, NULL); vars[0] = u; varnames[0] = "ucomp"; vars[1] = v; varnames[1] = "vcomp"; vars[2] = w; varnames[2] = "wcomp"; (void)DBPutUcdvar(dbfile, "velocity", name, 3, varnames, vars, NNODES, NULL, 0, idatatype, DB_NODECENT, NULL); return (meshid); }
/*---------------------------------------------------------------------- * Routine build_ucd * * Purpose * * Build ucd-mesh, ucd-var, facelist and zonelist, and return * the mesh ID. * * Arguments * name Name to assign mesh. * * Modifications * * Lisa J. Roberts, Fri Apr 7 09:35:52 PDT 2000 * Changed the prototype to ANSI standard and explicitly indicated * the function returns an int. Got rid of flid, zlid, varid, i, * dfnew, dbid, and matid, which were unused. * *--------------------------------------------------------------------*/ int build_ucd(DBfile *dbfile, char *name) { #define NMATS 2 #define NZONES 6 #define NFACES 10 #define NNODES 12 #define MAXMIX 12 #define MAXOMIX 4 #define NZSHAPES 1 #define NFSHAPES 1 #define NFTYPES 0 #define LZNODELIST 24 #define LFNODELIST 20 /*---------------------------------------------------------------------- The test mesh looks like this: 3. | 0 4 8 | 2. | 1 5 9 | 1. | 2 6 10 | | 3 7 11 0. --------------------------- 0. .5 1. *---------------------------------------------------------------------*/ int meshid; /* Default model for material data */ static int matlist[NZONES] = {1, -1, 2, 1, -3, 2}; static int matnos[NMATS] = {1, 2}; static float mix_vf[MAXMIX] = {.6, .8, .4, .2}; static int mix_next[MAXMIX] = {2, 0, 4, 0}; static int mix_mat[MAXMIX] = {1, 2, 1, 2}; static int mix_zone[MAXMIX] = {0, 0, 3, 3}; /* OTHER model for material data */ #if 0 static int imatlist[NZONES] = {1, 0, 2, 1, 0, 2}; static int nmix[NMATS] = {2, 2}; static int mixedels[MAXMIX] = {1, 4, 1, 4}; #endif static float x[NNODES] = {9., 9., 9., 9., 10., 10., 10., 10., 11., 11., 11., 11.}; static float y[NNODES] = {3., 2., 1., 0., 3., 2., 1., 0., 3., 2., 1., 0.}; static float u[NNODES] = {0., .5, 1., 0., .5, 1., 0., .5, 1., 0., .5, 1.}; static float v[NNODES] = {0., .5, 1., 0., .5, 1., 0., .5, 1., 0., .5, 1.}; static float d[NZONES] = {2., 4., 6., 8., 10., 12.}; #if 0 static float df[MAXOMIX] = {.58, .78, .42, .22}; static float vf[MAXOMIX] = {.4, .45, .6, .55}; #endif static int fnodelist[LFNODELIST] = {0, 1, 1, 2, 2, 3, 3, 7, 7, 11, 11, 10, 10, 9, 9, 8, 8, 4, 4, 0}; static int znodelist[LZNODELIST] = {0, 1, 5, 4, 4, 5, 9, 8, 1, 2, 6, 5, 5, 6, 10, 9, 2, 3, 7, 6, 6, 7, 11, 10}; int fshapesize, fshapecnt, zshapesize, zshapecnt; int idatatype, mixlen; int dims; #if 0 double ttime = 2.345; int tcycle = 200; #endif float *coords[3], *vars[2]; char *coordnames[3], *varnames[2]; fshapesize = 2; fshapecnt = NFACES; zshapesize = 4; zshapecnt = NZONES; idatatype = DB_FLOAT; mixlen = MAXMIX; coords[0] = x; coords[1] = y; coordnames[0] = "X"; coordnames[1] = "Y"; vars[0] = d; varnames[0] = "d"; (void)DBPutFacelist(dbfile, "fl", NFACES, 2, fnodelist, LFNODELIST, 0, NULL, &fshapesize, &fshapecnt, NFSHAPES, NULL, NULL, 0); (void)DBPutZonelist(dbfile, "zl", NZONES, 2, znodelist, LZNODELIST, 0, &zshapesize, &zshapecnt, NZSHAPES); meshid = DBPutUcdmesh(dbfile, name, 2, coordnames, coords, NNODES, NZONES, "zl", "fl", DB_FLOAT, NULL); vars[0] = d; varnames[0] = "d"; (void)DBPutUcdvar(dbfile, varnames[0], name, 1, varnames, vars, NZONES, NULL, 0, idatatype, DB_ZONECENT, NULL); vars[0] = u; varnames[0] = "u"; (void)DBPutUcdvar(dbfile, varnames[0], name, 1, varnames, vars, NNODES, NULL, 0, idatatype, DB_NODECENT, NULL); vars[0] = v; varnames[0] = "v"; (void)DBPutUcdvar(dbfile, varnames[0], name, 1, varnames, vars, NNODES, NULL, 0, idatatype, DB_NODECENT, NULL); vars[0] = u; varnames[0] = "ucomp"; vars[1] = v; varnames[1] = "vcomp"; (void)DBPutUcdvar(dbfile, "velocity", name, 2, varnames, vars, NNODES, NULL, 0, idatatype, DB_NODECENT, NULL); dims = NZONES; (void)DBPutMaterial(dbfile, "material", name, NMATS, matnos, matlist, &dims, 1, mix_next, mix_mat, mix_zone, mix_vf, mixlen, DB_FLOAT, NULL); #if 0 mixlen = -99; for (i = 0; i < MAXMIX; i++) { mix_mat[i] = -99; mix_next[i] = -99; mix_zone[i] = -99; mix_vf[i] = -99.; } DBConvertMat(NMATS, NZONES, nmix, mixedels, imatlist, matnos, vf, DB_FLOAT, &mixlen, matlist, mix_next, mix_mat, mix_zone, mix_vf); (void)DBPutMaterial(dbfile, "material", name, matnos, NMATS, matlist, &dims, 1, mix_next, mix_mat, mix_zone, mix_vf, mixlen, DB_FLOAT, NULL); #endif return (meshid); }
static void build_csg(DBfile *dbfile, char *name) { // build and output the csg mesh (boundaries) { int typeflags[] = { DBCSG_SPHERE_PR, DBCSG_PLANE_X, DBCSG_PLANE_X, DBCSG_CYLINDER_PNLR, //DBCSG_QUADRIC_G, DBCSG_SPHERE_PR, DBCSG_SPHERE_PR }; float coeffs[] = { 0.0, 0.0, 0.0, 5.0, // point-radius form of sphere -2.0, // x-intercept form of plane 2.0, // x-intercept form of plane -10.0, 0.0, 0.0, 1.0, 0.0, 0.0, 20.0, 4.5, // point-normal-length-radius form of cylinder // 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -20.25, 0.0, 0.0, 49.5, 50.0, // point-radius form of sphere 0.0, 0.0, -49.5, 50.0 // point radius form of sphere }; int nbounds = sizeof(typeflags) / sizeof(typeflags[0]); int lcoeffs = sizeof(coeffs) / sizeof(coeffs[0]); double extents[] = {-5.0, -5.0, -5.0, 5.0, 5.0, 5.0}; DBPutCsgmesh(dbfile, name, 3, nbounds, typeflags, NULL, coeffs, lcoeffs, DB_FLOAT, extents, "csgzl", NULL); } // build and output the csg zonelist { int typeflags[] = { DBCSG_INNER, // 0: inside of sphere DBCSG_OUTER, // 1: in-front of -X plane DBCSG_INNER, // 2: in-back of +X plane DBCSG_INNER, // 3: inside of quadric cylinder DBCSG_INTERSECT, // 4: sphere cut to -X plane DBCSG_INTERSECT, // 5: -X-cut-sphere cut to +X plane DBCSG_DIFF, // 6: cut-sphere minus quadric cylinder DBCSG_INNER, // 7: inside of large upper sphere DBCSG_INNER, // 8: inside of large lower sphere DBCSG_INTERSECT, // 9: intersection of large spheres DBCSG_INTERSECT, //10: 9 cut to inside of quadric cylinder DBCSG_INTERSECT //11: 10 cut to inside of smaller sphere }; // 0 1 2 3 4 5 6 7 8 9 10 11 int leftids[] = { 0, 1, 2, 3, 0, 4, 5, 4, 5, 7, 9, 10}; int rightids[] = {-1, -1, -1, -1, 1, 2, 3, -1, -1, 8, 3, 0}; int zonelist[] = {6, 11}; int nregs = sizeof(typeflags) / sizeof(typeflags[0]); int nzones = sizeof(zonelist) / sizeof(zonelist[0]); char *zonenames[] = {"ring housing", "lens-shaped fin"}; DBoptlist *optlist = DBMakeOptlist(1); DBAddOption(optlist, DBOPT_ZONENAMES, zonenames); DBPutCSGZonelist(dbfile, "csgzl", nregs, typeflags, leftids, rightids, NULL, 0, DB_INT, nzones, zonelist, optlist); DBFreeOptlist(optlist); } // output a csg variable { void *pv[1]; double var1_data[] = {10.0, 100.0}; char *pname[1]; char name1[] = "var1"; pv[0] = var1_data; pname[0] = name1; #ifdef DB_SDX // Use existence of sdx driver to detect earlier versions. // Sdx driver exists in 4.5.1 and earlier. DBPutCsgvar(dbfile, "var1", "csgmesh", 1, (const char**)pname, (const void**)pv, 2, DB_DOUBLE, DB_ZONECENT, 0); #else DBPutCsgvar(dbfile, "var1", "csgmesh", 1, pname, pv, 2, DB_DOUBLE, DB_ZONECENT, 0); #endif } // output a material for this csg mesh { int matnos[] = {2, 3}; int matlist[] = {2, 3}; int dims = 2; DBPutMaterial(dbfile, "mat", "csgmesh", 2, matnos, matlist, &dims, 1, 0, 0, 0, 0, 0, DB_FLOAT, 0); } }
/*------------------------------------------------------------------------- * Function: main * * Purpose: * * Return: 0 * * Programmer: * * Modifications: * Robb Matzke, 1999-04-09 * Added argument parsing to control the driver which is used. * *------------------------------------------------------------------------- */ int main(int argc, char *argv[]) { int i,j; DBfile *file = NULL; char *coordnames[2]; /* Name the axes */ float xcoords[NX + 1]; float ycoords[NY + 1]; float *coordinates[2]; int dims[2]; float float_var[NX*NY]; float dist_var[NX*NY]; float density_var[NX*NY]; float total_length, frac_length; int matnos[2]; int nmatspec[2]; float species_mf[MAX_MIX_LEN]; int matlist[MAX_MIX_LEN]; int speclist[MAX_MIX_LEN]; int nspecies_mf; float dist; DBoptlist *optlist; int value; int driver=DB_PDB; char *filename="species.silo"; int show_all_errors = FALSE; /* Parse command-line */ for (i=1; i<argc; i++) { if (!strncmp(argv[i], "DB_PDB", 6)) { driver = StringToDriver(argv[i]); filename = "species.pdb"; } else if (!strncmp(argv[i], "DB_HDF5", 7)) { driver = StringToDriver(argv[i]); filename = "species.h5"; } else if (!strcmp(argv[i], "show-all-errors")) { show_all_errors = 1; } else if (argv[i][0] != '\0') { fprintf(stderr, "%s: ignored argument `%s'\n", argv[0], argv[i]); } } if (show_all_errors) DBShowErrors(DB_ALL_AND_DRVR, 0); printf("Creating a 2D rectilinear SILO file `%s'...\n", filename); /* Create the SILO file */ if ((file = DBCreate(filename, DB_CLOBBER, DB_LOCAL, NULL, driver)) == NULL) { fprintf(stderr, "Unable to create SILO file\n"); exit(1); } /* Name the coordinate axes 'X' and 'Y' */ coordnames[0] = (char *) _db_safe_strdup("X"); coordnames[1] = (char *) _db_safe_strdup("Y"); /* Set up the coordinate values */ /* X Coordinates */ for(i=0;i<NX+1;i++) xcoords[i] = ((double)i)/NX; /* Y Coordinates */ for(j=0;j<NY+1;j++) ycoords[j] = ((double)j)/NY; coordinates[0] = xcoords; coordinates[1] = ycoords; /* Enumerate the dimensions (4 values in x direction, 3 in y) */ dims[0] = NX + 1; dims[1] = NY + 1; /* Write out the mesh to the file */ DBPutQuadmesh(file, "quad_mesh", (DBCAS_t) coordnames, coordinates, dims, 2, DB_FLOAT, DB_COLLINEAR, NULL); /* Set up the material and species information */ /* Material numbers */ matnos[0] = 1; matnos[1] = 2; /* Material species numbers */ nmatspec[0] = 3; nmatspec[1] = 1; printf("Calculating material information.\n"); /* Mixed species array */ nspecies_mf = 0; for(j=0;j<NY;j++) { for(i=0;i<NX;i++) { if (xcoords[i] >= 0.8) { matlist[j*NX+i] = 2; /* All one species */ speclist[j*NX+i] = nspecies_mf + 1; species_mf[nspecies_mf++] = 1.0; } else { matlist[j*NX+i] = 1; speclist[j*NX+i] = nspecies_mf + 1; if (xcoords[i+1] < (1.0/3.0)) { /* All on left - All species 1 */ species_mf[nspecies_mf++] = 1.0; species_mf[nspecies_mf++] = 0.0; species_mf[nspecies_mf++] = 0.0; } else if ((xcoords[i] > (1.0/3.0)) && (xcoords[i+1] < (2.0/3.0))) { /* All in middle - All species 2 */ species_mf[nspecies_mf++] = 0.0; species_mf[nspecies_mf++] = 1.0; species_mf[nspecies_mf++] = 0.0; } else if (xcoords[i] > (2.0/3.0)) { /* All on right - All species 3 */ species_mf[nspecies_mf++] = 0.0; species_mf[nspecies_mf++] = 0.0; species_mf[nspecies_mf++] = 1.0; } else { /* Somewhere on a boundary */ if (xcoords[i] < (1.0/3.0)) { /* Left boundary */ total_length = (xcoords[i+1] - xcoords[i]); frac_length = ((1.0/3.0) - xcoords[i]); species_mf[nspecies_mf++] = (frac_length/total_length); species_mf[nspecies_mf++] = 1 - (frac_length/total_length); species_mf[nspecies_mf++] = 0.0; } else { /* Right boundary */ total_length = (xcoords[i+1] - xcoords[i]); frac_length = ((2.0/3.0) - xcoords[i]); species_mf[nspecies_mf++] = 0.0; species_mf[nspecies_mf++] = (frac_length/total_length); species_mf[nspecies_mf++] = 1 - (frac_length/total_length); } } } } } /* The dimensions have changed since materials are defined for zones, * not for nodes */ dims[0] = NX; dims[1] = NY; if (nspecies_mf>MAX_MIX_LEN) { fprintf(stderr,"Length %d of mixed species arrays exceeds the max %d.\n", nspecies_mf,MAX_MIX_LEN); fprintf(stderr,"Memory may have been corrupted, and the SILO\n"); fprintf(stderr,"file may be invalid.\n"); } /* Write out the material to the file */ DBPutMaterial(file, "mat1", "quad_mesh", 2, matnos, matlist, dims, 2, NULL, NULL, NULL, NULL, 0, DB_FLOAT, NULL); /* Write out the material species to the file */ DBPutMatspecies(file, "matspec1", "mat1", 2, nmatspec, speclist, dims, 2, nspecies_mf, species_mf, NULL, 0, DB_FLOAT, NULL); free(coordnames[0]); free(coordnames[1]); printf("Calculating variables.\n"); /* Set up the variables */ for(j=0;j<NY;j++) for(i=0;i<NX;i++) { dist = distance((xcoords[i]+xcoords[i+1])/2,(ycoords[j]+ycoords[j+1])/2,0.5,0.5); float_var[j*NX+i] = cos(SCALE*dist)/exp(dist*DAMP); dist_var[j*NX+i] = dist; if (xcoords[i]<(1.0/3.0)) density_var[j*NX+i] = 30.0; else if ((xcoords[i]<(2.0/3.0)) || (xcoords[i] >= 0.8)) density_var[j*NX+i] = 1000.0; else density_var[j*NX+i] = 200.0; } /* Make a DBoptlist so that we can tell the variables to use the material species stuff */ optlist = DBMakeOptlist(1); value = DB_ON; DBAddOption(optlist, DBOPT_USESPECMF, &value); /* Write the data variables to the file */ DBPutQuadvar1(file, "float_var", "quad_mesh", float_var, dims, 2, NULL, 0, DB_FLOAT, DB_ZONECENT, optlist); DBPutQuadvar1(file, "dist_var", "quad_mesh", dist_var, dims, 2, NULL, 0, DB_FLOAT, DB_ZONECENT, optlist); DBPutQuadvar1(file, "density_var", "quad_mesh", density_var, dims, 2, NULL, 0, DB_FLOAT, DB_ZONECENT, optlist); DBFreeOptlist(optlist); DBClose(file); printf("Finished.\n"); CleanupDriverStuff(); return (0); }
/*---------------------------------------------------------------------------- * Function: writematspec * * Inputs: db (DBfile*): the Silo file handle * * Returns: (void) * * Abstract: Write the material and species info stored in the global Mesh * to the Silo file. Handle mixed zones properly for both. * * Modifications: * Sean Ahern, Wed Feb 6 16:32:35 PST 2002 * Added material names. *---------------------------------------------------------------------------*/ int writematspec(DBfile *db) { int x, y, c; int dims[2]; int matlist[1000]; int mix_mat[1000]; int mix_zone[1000]; int mix_next[1000]; float mix_vf[1000]; int mixc; int mfc; int speclist[1000]; int mixspeclist[1000]; float specmf[10000]; DBoptlist *optlist; dims[0] = mesh.zx; dims[1] = mesh.zy; /* do Materials */ c = 0; mixc = 0; for (x = 0; x < mesh.zx; x++) { for (y = 0; y < mesh.zy; y++) { int nmats = mesh.zone[x][y].nmats; if (nmats == 1) { /* clean zone */ int m = -1; int i; for (i = 1; i <= nmat; i++) if (mesh.zone[x][y].matvf[i] > 0) m = i; if (m < 0) { printf("Internal error!\n"); exit(-1); }; matlist[c] = m; c++; } else { /* mixed zone */ int m = 0; matlist[c] = -mixc - 1; for (m = 1; m <= nmat && nmats > 0; m++) { if (mesh.zone[x][y].matvf[m] > 0) { mix_mat[mixc] = m; mix_vf[mixc] = mesh.zone[x][y].matvf[m]; mix_zone[mixc] = c + 1; /* 1-origin */ nmats--; if (nmats) mix_next[mixc] = mixc + 2; /* next + 1-origin */ else mix_next[mixc] = 0; mixc++; } } c++; } } } optlist = DBMakeOptlist(10); DBAddOption(optlist, DBOPT_MATNAMES, matnames); DBPutMaterial(db, "Material", "Mesh", nmat, matnos, matlist, dims, 2, mix_next, mix_mat, mix_zone, mix_vf, mixc, DB_FLOAT, optlist); /* Okay! Now for the species! */ c = 0; mixc = 0; mfc = 0; for (x = 0; x < mesh.zx; x++) { for (y = 0; y < mesh.zy; y++) { if (mesh.zone[x][y].nmats == 1) { int m = -1; int i, s; for (i = 1; i <= nmat; i++) if (mesh.zone[x][y].matvf[i] > 0) m = i; if (m < 0) { printf("Internal error!\n"); exit(-1); }; if (nspec[m - 1] == 1) { speclist[c] = 0; /* no mf for this mat: only 1 species */ } else { speclist[c] = mfc + 1; /* 1-origin */ for (s = 0; s < nspec[m - 1]; s++) { specmf[mfc] = mesh.zone[x][y].specmf[m][s]; mfc++; } } c++; } else { int m; speclist[c] = -mixc - 1; for (m = 1; m <= nmat; m++) { if (mesh.zone[x][y].matvf[m] > 0) { if (nspec[m - 1] == 1) { mixspeclist[mixc] = 0; /* no mf for this mat: * only 1 species */ } else { int s; mixspeclist[mixc] = mfc + 1; /* 1-origin */ for (s = 0; s < nspec[m - 1]; s++) { specmf[mfc] = mesh.zone[x][y].specmf[m][s]; mfc++; } } mixc++; } } c++; } } } DBClearOptlist(optlist); DBAddOption(optlist, DBOPT_SPECNAMES, specnames); DBAddOption(optlist, DBOPT_SPECCOLORS, speccolors); DBPutMatspecies(db, "Species", "Material", nmat, nspec, speclist, dims, 2, mfc, specmf, mixspeclist, mixc, DB_FLOAT, optlist); return mixc; }
int main(int argc, char *argv[]) { int nnodes = NNODES; int nzones = NZONES; int nodelist[23]; int shapesize[] = {8, 4, 5, 6}; int shapecnt[] = {1, 1, 1, 1}; char mesh_command[256]; int len; char *filename = "alltypes.silo"; int driver = DB_PDB; DBfile *dbfile = NULL; int ndims = NDIMS; int dims[NDIMS]; double *coords[NDIMS]; double x[NNODES]; double y[NNODES]; double z[NNODES]; DBfacelist *facelist = NULL; double nodal[NNODES]; double zonal[NZONES]; int matlist[NZONES]; int mats[] = {1,2,3,4}; int i,j; const int origin = 0; int show_all_errors = FALSE; /* Parse command-line options */ for (i=1; i<argc; i++) { if (!strncmp(argv[i], "DB_PDB",6)) { driver = StringToDriver(argv[i]); filename = "alltypes.pdb"; } else if (!strncmp(argv[i], "DB_HDF5", 7)) { driver = StringToDriver(argv[i]); filename = "alltypes.h5"; } else if (!strcmp(argv[i], "show-all-errors")) { show_all_errors = 1; } else if (argv[i][0] != '\0') { fprintf(stderr, "unknown option: %s\n", argv[i]); exit(1); } } /* Turn on error handling */ DBShowErrors(show_all_errors?DB_ALL_AND_DRVR:DB_ABORT, NULL); DBSetFriendlyHDF5Names(2); /* Create file */ printf("Creating test file \"%s\".\n", filename); dbfile = DBCreate(filename, DB_CLOBBER, DB_LOCAL, "3D ucd", driver); i = 0; /* 0 */ x[i] = 0.5; y[i] = 1.0; z[i++] = 0.0; /* 1 */ x[i] = 1.5; y[i] = 1.0; z[i++] = 0.0; /* 2 */ x[i] = 1.5; y[i] = 1.0; z[i++] = 1.0; /* 3 */ x[i] = 0.5; y[i] = 1.0; z[i++] = 1.0; /* 4 */ x[i] = 0.5; y[i] = 2.0; z[i++] = 0.0; /* 5 */ x[i] = 1.5; y[i] = 2.0; z[i++] = 0.0; /* 6 */ x[i] = 2.5; y[i] = 2.0; z[i++] = 0.0; /* 7 */ x[i] = 2.5; y[i] = 2.0; z[i++] = 1.0; /* 8 */ x[i] = 1.5; y[i] = 2.0; z[i++] = 1.0; /* 9 */ x[i] = 0.5; y[i] = 2.0; z[i++] = 1.0; /* 10 */ x[i] = 0.0; y[i] = 3.0; z[i++] = 0.5; /* 11 */ x[i] = 1.0; y[i] = 3.0; z[i++] = 0.5; /* 12 */ x[i] = 2.0; y[i] = 3.0; z[i++] = 0.5; coords[0] = x; coords[1] = y; coords[2] = z; DBPutUcdmesh(dbfile, "mesh", 3, NULL, (void *)coords, nnodes, nzones, "zonelist", "facelist", DB_DOUBLE, NULL); i = 0; /* Hex */ nodelist[i++] = 4; nodelist[i++] = 5; nodelist[i++] = 8; nodelist[i++] = 9; nodelist[i++] = 0; nodelist[i++] = 1; nodelist[i++] = 2; nodelist[i++] = 3; /* Tet */ nodelist[i++] = 10; nodelist[i++] = 4; nodelist[i++] = 11; nodelist[i++] = 9; /* Pyramid */ nodelist[i++] = 4; nodelist[i++] = 5; nodelist[i++] = 8; nodelist[i++] = 9; nodelist[i++] = 11; /* Prism */ nodelist[i++] = 5; nodelist[i++] = 6; nodelist[i++] = 7; nodelist[i++] = 8; nodelist[i++] = 11; nodelist[i++] = 12; for (j=0; j<i; j++) nodelist[j] += origin; DBSetDeprecateWarnings(0); DBPutZonelist(dbfile, "zonelist", nzones, ndims, nodelist, 23, origin, shapesize, shapecnt, 4); DBSetDeprecateWarnings(3); facelist = DBCalcExternalFacelist(nodelist, nnodes, origin, shapesize, shapecnt, 4, NULL, 0); DBPutFacelist(dbfile, "facelist", facelist->nfaces, facelist->ndims, facelist->nodelist, facelist->lnodelist, facelist->origin, facelist->zoneno, facelist->shapesize, facelist->shapecnt, facelist->nshapes, facelist->types, facelist->typelist, facelist->ntypes); for(i=0;i<nnodes;i++) nodal[i] = x[i]; zonal[0] = 4.0; zonal[1] = 2.0; zonal[2] = 0.0; zonal[3] = 7.0; DBPutUcdvar1(dbfile, "nodal", "mesh", (void*)nodal, nnodes, NULL, 0, DB_DOUBLE, DB_NODECENT, NULL); DBPutUcdvar1(dbfile, "zonal", "mesh", (void*)zonal, nzones, NULL, 0, DB_DOUBLE, DB_ZONECENT, NULL); matlist[0] = 1; matlist[1] = 2; matlist[2] = 3; matlist[3] = 4; dims[0] = nzones; DBPutMaterial(dbfile, "mat", "mesh", 4, mats, matlist, dims, 1, NULL, NULL, NULL, NULL, 0, DB_DOUBLE, NULL); sprintf(mesh_command, "mesh mesh"); len = strlen(mesh_command) + 1; DBWrite(dbfile, "_meshtvinfo", mesh_command, &len, 1, DB_CHAR); DBClose(dbfile); DBFreeFacelist(facelist); CleanupDriverStuff(); return 0; }
/*---------------------------------------------------------------------- * Routine build_ucd3 * * Purpose * * Build a 3D ucd-mesh, ucd-var, facelist and zonelist, and return * the mesh ID. * * Arguments * name Name to assign mesh. * * Modifications * * Lisa J. Roberts, Fri Apr 7 10:48:31 PDT 2000 * Changed the prototype to ANSI standard and explicitly indicated * the function returns an int. Got rid of flid, zlid, varid, i, * ln, dbid, and matid, which were unused. * *--------------------------------------------------------------------*/ static int build_ucd3(DBfile *dbfile, char *name) { #define NZONES 3 /* Number of zones (elements) */ #define NFACES 14 /* Number of external faces */ #define NNODES 16 /* Number of mesh nodes */ #define NZSHAPES 1 /* Number of zone shapes */ #define NFSHAPES 1 /* Number of face shapes */ #define NFTYPES 0 /* Number of face types */ #define LZNODELIST 24 /* Length of zonelist nodelist */ #define LFNODELIST 56 /* Length of facelist nodelist */ /* Misc variables */ int meshid; int fshapesize, fshapecnt, zshapesize, zshapecnt; int idatatype; int dims; int inode, iface, izone, ifl, izl, nface = 0; #if 0 int mixlen = 0; int tcycle = 200; double ttime = 2.345; float *vars[3]; char *varnames[3]; DBfacelist *fl; #endif float *coords[3]; char *coordnames[3]; /* Coordinates */ float x[NNODES]; float y[NNODES]; float z[NNODES]; /* Nodal quantities */ static float u[NNODES] = {0., 0., 0., 0., .1, .1, .1, .1, .2, .2, .2, .2, .3, .3, .3, .3}; #if 0 static float v[NNODES] = {0., 0., 0., 0., .1, .1, .1, .1, .2, .2, .2, .2, .3, .3, .3, .3}; static float w[NNODES] = {0., 0., 0., 0., .1, .1, .1, .1, .2, .2, .2, .2, .3, .3, .3, .3}; #endif /* Zonal quantities */ static float d[NZONES] = {2., 4., 6.}; /* Material data */ static int matlist[NZONES] = {1, 1, 2}; static int matnos[2] = {1, 2}; /* Facelist data */ int fzoneno[NFACES]; int fnodelist[LFNODELIST]; /* Zonelist data */ int znodelist[LZNODELIST]; fshapesize = 4; fshapecnt = NFACES; zshapesize = 8; zshapecnt = NZONES; idatatype = DB_FLOAT; dims = NZONES; /*-------------------------------------------------- * Compute coordinate values, zonelist values, and * facelist values for a sample 3D mesh. *-------------------------------------------------*/ inode = 0; for (izone = 0; izone <= NZONES; izone++) { x[inode++] = 0.; x[inode++] = 1.; x[inode++] = 1.; x[inode++] = 0.; inode -= 4; y[inode++] = (float)izone; y[inode++] = (float)izone; y[inode++] = (float)izone; y[inode++] = (float)izone; inode -= 4; z[inode++] = 0.; z[inode++] = 0.; z[inode++] = 1.; z[inode++] = 1.; } izl = 0; for (izone = 0; izone < NZONES; izone++) { for (inode = 0; inode < 4; inode++) { znodelist[izl++] = izone * 4 + inode; } for (inode = 0; inode < 4; inode++) { znodelist[izl++] = (izone + 1) * 4 + inode; } } ifl = 0; for (izone = 0; izone < NZONES; izone++) { for (iface = 0; iface < 3; iface++) { fnodelist[ifl++] = izone * 4 + iface; fnodelist[ifl++] = izone * 4 + iface + 1; fnodelist[ifl++] = izone * 4 + iface + 5; fnodelist[ifl++] = izone * 4 + iface + 4; } fnodelist[ifl++] = izone * 4 + 3; fnodelist[ifl++] = izone * 4; fnodelist[ifl++] = izone * 4 + 4; fnodelist[ifl++] = izone * 4 + 7; for (iface = 0; iface < 4; iface++) fzoneno[nface++] = izone; } fnodelist[ifl++] = 0; fnodelist[ifl++] = 1; fnodelist[ifl++] = 2; fnodelist[ifl++] = 3; fzoneno[nface++] = 0; fnodelist[ifl++] = 12; fnodelist[ifl++] = 13; fnodelist[ifl++] = 14; fnodelist[ifl++] = 15; fzoneno[nface++] = NZONES - 1; #if 1 /*-------------------------------------------------- * Write out the external facelist we defined * above. *-------------------------------------------------*/ DBPutFacelist(dbfile, "fl", NFACES, 3, fnodelist, LFNODELIST, 0, fzoneno, &fshapesize, &fshapecnt, NFSHAPES, NULL, NULL, 0); #else /*-------------------------------------------------- * Calculate an external facelist from the zonelist * information. Write it out. *-------------------------------------------------*/ fl = (DBfacelist *) DBCalcExternalFacelist(znodelist, NNODES, 0, &zshapesize, &zshapecnt, NZSHAPES, matlist, 2); DBPutFacelist(dbfile, "fl", fl->nfaces, 3, fl->nodelist, fl->lnodelist, 0, fl->zoneno, fl->shapesize, fl->shapecnt, fl->nshapes, NULL, NULL, 0); #endif /*-------------------------------------------------- * Write out the zonelist. *-------------------------------------------------*/ DBSetDeprecateWarnings(0); DBPutZonelist(dbfile, "zl", NZONES, 3, znodelist, LZNODELIST, 0, &zshapesize, &zshapecnt, NZSHAPES); DBSetDeprecateWarnings(3); /*-------------------------------------------------- * Write out the mesh. *-------------------------------------------------*/ coords[0] = x; coords[1] = y; coords[2] = z; coordnames[0] = "X"; coordnames[1] = "Y"; coordnames[2] = "Z"; meshid = DBPutUcdmesh(dbfile, name, 3, (DBCAS_t) coordnames, coords, NNODES, NZONES, "zl", "fl", DB_FLOAT, NULL); /*-------------------------------------------------- * Write out the material data. *-------------------------------------------------*/ DBPutMaterial(dbfile, "material", name, 2, matnos, matlist, &dims, 1, NULL, NULL, NULL, NULL, 0, DB_FLOAT, NULL); /*-------------------------------------------------- * Write out a zonal variable. *-------------------------------------------------*/ DBPutUcdvar1(dbfile, "d", name, d, NZONES, NULL, 0, idatatype, DB_ZONECENT, NULL); /*-------------------------------------------------- * Write out a nodal variable. *-------------------------------------------------*/ DBPutUcdvar1(dbfile, "u", name, u, NNODES, NULL, 0, idatatype, DB_NODECENT, NULL); return (meshid); }