/* Utility for printing the record info */ void QIO_print_record_info(QIO_RecordInfo *record_info){ printf("Record header: datatype %s recordtype %d \n", QIO_get_datatype(record_info), QIO_get_recordtype(record_info)); printf("precision %s colors %d spins %d count %d\n", QIO_get_precision(record_info), QIO_get_colors(record_info), QIO_get_spins(record_info), QIO_get_datacount(record_info)); if(QIO_get_recordtype(record_info) == QIO_HYPER){ int i; int n = QIO_get_hyper_spacetime(record_info); int *lower = QIO_get_hyperlower(record_info); int *upper = QIO_get_hyperupper(record_info); printf("Hypercube lower"); for(i = 0; i < n; i++){ printf(" %d",lower[i]); } printf("\n"); printf("Hypercube upper"); for(i = 0; i < n; i++){ printf(" %d",upper[i]); } printf("\n"); } }
int main(int argc, char *argv[]) { int ndim,dims[4]; gauge_file *gf; gauge_header *gh; FILE *fp; char *filename_milc,*filename_scidac; QIO_Layout layout; QIO_Reader *infile; QIO_RecordInfo rec_info; char *datatype; int status; int datum_size; int input_prec; int count = 4; int word_size; int typesize; w_serial_site_writer state; if(argc < 3) { fprintf(stderr,"Usage %s <SciDAC file> <MILC file>\n",argv[0]); exit(1); } filename_scidac = argv[1]; filename_milc = argv[2]; if(this_node == 0)printf("Converting file %s to MILC v5 file %s\n", filename_scidac, filename_milc); initialize_machine(&argc,&argv); #ifdef HAVE_QDP QDP_initialize(&argc, &argv); #endif this_node = mynode(); number_of_nodes = numnodes(); if(number_of_nodes != 1){ printf("This is single-processor code. Please rebuild as such.\n"); terminate(1); } /* Open the SciDAC file and discover the lattice dimensions. Then close. */ status = read_lat_dim_scidac(filename_scidac, &ndim, dims); if(status)terminate(1); if(ndim != 4){ printf("Wanted ndims = 4 in %s but got %d\n",filename_scidac,ndim); terminate(1); } nx = dims[0]; ny = dims[1]; nz = dims[2]; nt = dims[3]; volume = nx*ny*nz*nt; /* Finish setting up, now we know the dimensions */ setup(); /* Build the QIO layout */ build_qio_layout(&layout); /* Open the SciDAC file for reading */ infile = open_scidac_input(filename_scidac, &layout, 0, QIO_SERIAL); if(infile == NULL)terminate(1); /* Open the MILC v5 file for writing */ fp = fopen(filename_milc, "wb"); if(fp == NULL) { printf("Can't open file %s, error %d\n", filename_milc,errno);fflush(stdout); terminate(1); } gf = setup_output_gauge_file(); gh = gf->header; /* Read the SciDAC record header. */ xml_record_in = QIO_string_create(); status = QIO_read_record_info(infile, &rec_info, xml_record_in); if(status != QIO_SUCCESS)terminate(1); node0_printf("Record info \n\"%s\"\n",QIO_string_ptr(xml_record_in)); /* Make sure this is a lattice field */ datatype = QIO_get_datatype(&rec_info); typesize = QIO_get_typesize(&rec_info); if(strcmp(datatype, "QDP_F3_ColorMatrix") == 0 || strcmp(datatype, "USQCD_F3_ColorMatrix") == 0 || typesize == 72){ datum_size = sizeof(fsu3_matrix); input_prec = 1; word_size = sizeof(float); } else if(strcmp(datatype, "QDP_D3_ColorMatrix") == 0 || strcmp(datatype, "USQCD_F3_ColorMatrix") == 0 || typesize == 144){ datum_size = sizeof(dsu3_matrix); input_prec = 2; word_size = sizeof(double); } else { printf("Unrecognized datatype %s\n",datatype); terminate(1); } /* Copy the time stamp from the SciDAC file */ strncpy(gh->time_stamp, QIO_get_record_date(&rec_info), MAX_TIME_STAMP); gh->time_stamp[MAX_TIME_STAMP-1] = '\0'; /* Write the MILC v5 header */ gh->order = NATURAL_ORDER; /* Node 0 writes the header */ swrite_gauge_hdr(fp,gh); /* Assign values to file structure */ gf->fp = fp; gf->filename = filename_milc; gf->byterevflag = 0; /* Not used for writing */ gf->rank2rcv = NULL; /* Not used for writing */ gf->parallel = 0; /* Initialize writing the lattice data */ w_serial_start_lattice(gf, &state, input_prec); /* Read the SciDAC record data. The factory function writes the site links to a file. */ status = QIO_read_record_data(infile, w_serial_site_links, datum_size*count, word_size, (void *)&state); if(status != QIO_SUCCESS)terminate(1); node0_printf("SciDAC checksums %x %x\n", QIO_get_reader_last_checksuma(infile), QIO_get_reader_last_checksumb(infile)); /* Close the SciDAC file */ QIO_close_read(infile); /* Finish the MILC v5 file */ w_serial_finish_lattice(&state); w_serial_f(gf); QIO_string_destroy(xml_record_in); #ifdef HAVE_QDP QDP_finalize(); #endif normal_exit(0); return 0; }
/* Compare only fields that occur in the expected record info */ int QIO_compare_record_info(QIO_RecordInfo *found, QIO_RecordInfo *expect){ char myname[] = "QIO_compare_record_info"; if(QIO_defined_recordtype(expect)) if(!QIO_defined_recordtype(found) && QIO_get_recordtype(found) != QIO_get_recordtype(expect)) { printf("%s:Recordtype flag mismatch expected %d found %d \n",myname, QIO_get_recordtype(expect),QIO_get_recordtype(found)); return QIO_ERR_REC_INFO; } if(QIO_defined_datatype(expect)) if(!QIO_defined_datatype(found) && strncmp(QIO_get_datatype(found),QIO_get_datatype(expect), QIO_MAXVALUESTRING)) { printf("%s:Datatype mismatch expected %s found %s \n",myname, QIO_get_datatype(expect),QIO_get_datatype(found)); return QIO_ERR_REC_INFO; } if(QIO_defined_precision(expect)) if(!QIO_defined_precision(found) && strncmp(QIO_get_precision(found),QIO_get_precision(expect), QIO_MAXVALUESTRING)) { printf("%s:Precision mismatch expected %s found %s \n",myname, QIO_get_precision(expect),QIO_get_precision(found)); return QIO_ERR_REC_INFO; } if(QIO_defined_colors(expect)) if(!QIO_defined_colors(found) && QIO_get_colors(found) != QIO_get_colors(expect)) { printf("%s:Colors mismatch expected %d found %d \n",myname, QIO_get_colors(expect),QIO_get_colors(found)); return QIO_ERR_REC_INFO; } if(QIO_defined_spins(expect)) if(!QIO_defined_spins(found) && QIO_get_spins(found) != QIO_get_spins(expect)) { printf("%s:Spins mismatch expected %d found %d \n",myname, QIO_get_spins(expect),QIO_get_spins(found)); return QIO_ERR_REC_INFO; } if(QIO_defined_typesize(expect)) if(!QIO_defined_typesize(found) && QIO_get_typesize(found) != QIO_get_typesize(expect)) { printf("%s:Typesize mismatch expected %d found %d \n",myname, QIO_get_typesize(expect),QIO_get_typesize(found)); return QIO_ERR_REC_INFO; } if(QIO_defined_datacount(expect)) if(!QIO_defined_datacount(found) && QIO_get_datacount(found) != QIO_get_datacount(expect)) { printf("%s:Datacount mismatch expected %d found %d \n",myname, QIO_get_datacount(expect),QIO_get_datacount(found)); return QIO_ERR_REC_INFO; } return QIO_SUCCESS; }