/* ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc Name : readump_l3at_data.c Usage : This program reads UARS Level 3AT data files distributed from the GSFC DAAC. To run this program, type the program name followed by the metadata file name (*META extension). Example: readump_l3at_data MLS_L3AT_STEMP_D0006.V0001_C03_META Description : This program first opens the metadata file (*.*META) to get the data file name (*.*PROD), and its physical record size. The data file is then opened, and its contents are read and dumped to the screen. Author : KE - JUN SUN Hughes_STX Date : February 2, 1994 Limitations : This program and the data it reads are designed for machines running a UNIX operating system, and having 32-bit architecture. IEEE floating point and/or integer values will not translate correctly on other machines! Notes : Since this program uses the metadata file (*.*META) to get the data file name (*.*PROD) and record size, both the data file and its corresponding metadata file must be in the same directory. Algorithm information : No calculation is performed in this program. Version : 0 To compile this progam : cc readump_l3at_data.c -o readump_l3at_data executable code will be named readump_l3at_data cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/ #include #include main(argc,argv) int argc; char *argv[]; { char line[1000]; char temp[30],str[80],data_file[180],subtype[13],instmt[13]; int index,i,n,ret,rec,select,rec_size,*int4; int Total,Actual,St_index,Bs_index,T1,T2,Numb,yr,dy,ms; FILE *meta_ifp,*data_ifp; float *lat,*lon,*real4; float Lat,Lon,LST,SZA; float data[90],quality[90]; /* ******* Open meta data file first ******** */ meta_ifp = fopen(argv[1],"r"); if (meta_ifp == NULL) { printf(" Can not open meta data file \n"); exit(); } for(i=0;i<10;i++) fgets(line,80,meta_ifp); /* get data file name from line 10 or from meta data file name */ /* strncpy(str,&line[14],50); sscanf(str,"%s",data_file); */ strncpy(data_file,argv[1],(strlen(argv[1])-5)); strcat(data_file,"_PROD"); fgets(line,80,meta_ifp); fgets(line,80,meta_ifp); /* get record size from meta file */ strncpy(temp,&line[16],5); rec_size = atoi(temp); fclose(meta_ifp); /* **** Now open data file **** */ data_ifp=fopen(data_file,"r"); if (data_ifp == NULL) { printf(" Can not open data file \n"); exit(0); } printf(" ******************************************\n"); printf(" Reading %s\n",data_file); printf(" ******************************************\n"); memset(temp,' ',25); fread(line,1,rec_size,data_ifp); printf("-----------------------------\n"); printf(" Descriptor Recrod \n"); printf("-----------------------------\n"); printf(" SFDU T[Z] & L[Z] \n"); printf("-----------------------------\n"); strncpy(temp,&line[0],4); printf(" Control ID : %s\n",temp); memset(temp,' ',8); strncpy(temp,&line[4],1); printf(" Version ID : %s\n",temp); strncpy(temp,&line[5],1); printf(" Class ID : %s\n",temp); strncpy(temp,&line[8],4); printf(" Data descriptive record ID : %s\n",temp); strncpy(temp,&line[12],8); printf(" Length : %s\n",temp); printf("-----------------------------\n"); printf(" SFDU T[I] & L[I] \n"); printf("-----------------------------\n"); memset(temp,' ',8); strncpy(temp,&line[20],4); printf(" Control ID : %s\n",temp); memset(temp,' ',8); strncpy(temp,&line[24],1); printf(" Version ID : %s\n",temp); strncpy(temp,&line[25],1); printf(" Class ID : %s\n",temp); strncpy(temp,&line[28],4); printf(" Data descriptive record ID : %s\n",temp); strncpy(temp,&line[32],8); printf(" Length : %s\n",temp); fread(line,1,rec_size,data_ifp); printf("-----------------------------\n"); printf(" Label record \n"); printf("-----------------------------\n"); memset(temp,' ',8); strncpy(temp,&line[0],4); printf(" Satellite ID : %s\n",temp); memset(temp,' ',8); strncpy(temp,&line[4],2); printf(" Record type : %s\n",temp); strncpy(temp,&line[6],12); sscanf(temp,"%s",instmt); printf(" Instrument ID : %s\n",instmt); strncpy(temp,&line[18],12); sscanf(temp,"%s",subtype); printf(" Data subtype or species : %s\n",subtype); memset(temp,' ',12); strncpy(temp,&line[30],4); printf(" Format version number : %s\n",temp); strncpy(temp,&line[34],8); printf(" Physical record count : %s\n",temp); memset(temp,' ',12); strncpy(temp,&line[43],4); printf(" Number of continuation records for file label : %s\n",temp); strncpy(temp,&line[46],8); printf(" Number of physical records in file : %s\n",temp); memset(temp,' ',12); /* strncpy(temp,&line[77],14); printf(" Year day Ms for 1st data record : %s\n",temp); strncpy(temp,&line[91],14); printf(" Year day Ms for last data record : %s\n",temp); memset(temp,' ',20); */ printf(" Year day Ms for earliest data record : "); strncpy(temp,&line[77],3); sscanf(temp,"%d",&yr); strncpy(temp,&line[80],3); sscanf(temp,"%d",&dy); strncpy(temp,&line[83],8); sscanf(temp,"%d",&ms); printf("%3d %3d %8d\n",yr,dy,ms); memset(temp,' ',8); printf(" Year day Ms for last data record : "); strncpy(temp,&line[91],3); sscanf(temp,"%d",&yr); strncpy(temp,&line[94],3); sscanf(temp,"%d",&dy); strncpy(temp,&line[97],8); sscanf(temp,"%d",&ms); printf("%3d %3d %8d\n",yr,dy,ms); memset(temp,' ',20); strncpy(temp,&line[105],3); printf(" Data level : %s\n",temp); strncpy(temp,&line[108],4); printf(" UARS day number : %s\n",temp); strncpy(temp,&line[112],4); printf(" Number of data points per record : %s\n",temp); strncpy(temp,&line[116],4); Bs_index = atoi(temp); printf(" Base index of data point value : %d\n",Bs_index); strncpy(temp,&line[120],5); printf(" Record length in bytes : %s\n",temp); strncpy(temp,&line[125],9); printf(" CCB version number : %s\n",temp); memset(temp,' ',12); strncpy(temp,&line[134],5); printf(" File cycle number : %s\n",temp); memset(temp,' ',12); strncpy(temp,&line[139],1); printf(" Virtual file flag : %s\n",temp); strncpy(temp,&line[140],4); printf(" Total number of time/version in file : %s\n",temp); strncpy(temp,&line[144],4); printf(" Number of time/version in record : %s\n",temp); memset(temp,' ',20); rec = 2; /* data rec starts */ do { ret = fread(line,1,rec_size,data_ifp); if (ret > 0) { printf("\n-----------------------------\n"); printf(" Record : %d data record\n",rec); printf("-----------------------------\n"); strncpy(temp,&line[0],4); printf(" Satellite ID : %s\n",temp); memset(temp,' ',8); strncpy(temp,&line[4],2); printf(" Record type : %s\n",temp); strncpy(temp,&line[6],12); printf(" Instrument ID : %s\n",temp); strncpy(temp,&line[18],10); printf(" Physical record count : %s\n",temp); memset(temp,' ',10); int4 = (int *)&line[28]; Total = *int4; printf(" Total number points in record : %d\n",Total); int4 = (int *)&line[32]; Actual = *int4; printf(" Number of Actual points : %d\n",Actual); int4 = (int *)&line[36]; St_index = *int4; printf(" Starting index of 1st actual point : %d\n",St_index); int4 = (int *)&line[40]; T1 = *int4; int4 = (int *)&line[44]; T2 = *int4; printf(" UDTF time : %d %d (year day, milliseconds)\n",T1,T2); real4 = (float *)&line[48]; Lat = *real4; printf(" Latitude : %f (degrees)\n",Lat); real4 = (float *)&line[52]; Lon = *real4; printf(" Longitude : %f (degrees)\n",Lon); real4 = (float *)&line[56]; LST = *real4; printf(" Local solar time : %f (hours)\n",LST); real4 = (float *)&line[60]; SZA = *real4; printf(" Solar zenith angle : %f (degrees)\n\n",SZA); index = 64; for (i=0;i -3.4e38 && data[i] < 3.4e38) printf("%4d) %e %e \n",i+Bs_index, data[i],quality[i]); else printf("%4d) *** Fill value *** \n", i+Bs_index); } rec++; } /* if ret != EOF */ } while (ret > 0); fclose(data_ifp); }