int main (int argc, char **argv) { char program_name[] = "mbnavlist"; char help_message[] = "mbnavlist prints the specified contents of navigation records\nin a swath sonar data file to stdout. The form of the \noutput is quite flexible; mbnavlist is tailored to produce \nascii files in spreadsheet style with data columns separated by tabs."; char usage_message[] = "mbnavlist [-Byr/mo/da/hr/mn/sc -Ddecimate -Eyr/mo/da/hr/mn/sc \n-Fformat -Gdelimiter -H -Ifile -Kkind -Llonflip \n-Ooptions -Rw/e/s/n -Sspeed \n-Ttimegap -V -Zsegment]"; extern char *optarg; int errflg = 0; int c; int help = 0; int flag = 0; /* MBIO status variables */ int status = MB_SUCCESS; int verbose = 0; int error = MB_ERROR_NO_ERROR; char *message; /* MBIO read control parameters */ int read_datalist = MB_NO; char read_file[MB_PATH_MAXLINE]; void *datalist; int look_processed = MB_DATALIST_LOOK_UNSET; double file_weight; int format; int pings; int decimate; int lonflip; double bounds[4]; int btime_i[7]; int etime_i[7]; double btime_d; double etime_d; double speedmin; double timegap; char file[MB_PATH_MAXLINE]; int beams_bath; int beams_amp; int pixels_ss; /* data record source types */ int nav_source; int heading_source; int vru_source; int svp_source; int aux_nav_channel = -1; int data_kind = -1; /* output format list controls */ char list[MAX_OPTIONS]; int n_list; double distance_total; int nread; int time_j[5]; int invert_next_value = MB_NO; int signflip_next_value = MB_NO; int first = MB_YES; int ascii = MB_YES; int segment = MB_NO; char segment_tag[MB_PATH_MAXLINE]; char delimiter[MB_PATH_MAXLINE]; /* MBIO read values */ void *mbio_ptr = NULL; void *store_ptr; int kind; int time_i[7]; double time_d; double navlon; double navlat; double speed; double heading; double distance; double altitude; double sonardepth; double draft; double roll; double pitch; double heave; char *beamflag = NULL; double *bath = NULL; double *bathacrosstrack = NULL; double *bathalongtrack = NULL; double *amp = NULL; double *ss = NULL; double *ssacrosstrack = NULL; double *ssalongtrack = NULL; char comment[MB_COMMENT_MAXLINE]; int atime_i[7 * MB_ASYNCH_SAVE_MAX]; double atime_d[MB_ASYNCH_SAVE_MAX]; double anavlon[MB_ASYNCH_SAVE_MAX]; double anavlat[MB_ASYNCH_SAVE_MAX]; double aspeed[MB_ASYNCH_SAVE_MAX]; double aheading[MB_ASYNCH_SAVE_MAX]; double adraft[MB_ASYNCH_SAVE_MAX]; double aroll[MB_ASYNCH_SAVE_MAX]; double apitch[MB_ASYNCH_SAVE_MAX]; double aheave[MB_ASYNCH_SAVE_MAX]; /* additional time variables */ int first_m = MB_YES; double time_d_ref; int first_u = MB_YES; time_t time_u; time_t time_u_ref; /* course calculation variables */ double dlon, dlat, minutes; int degrees; char hemi; double headingx, headingy, mtodeglon, mtodeglat; double course, course_old; double time_d_old; double time_interval; double speed_made_good, speed_made_good_old; double navlon_old, navlat_old; double dx, dy; double b; int read_data; int inav, n; int nnav; int i, j; /* get current default values */ status = mb_defaults(verbose,&format,&pings,&lonflip,bounds, btime_i,etime_i,&speedmin,&timegap); /* set default input to datalist.mb-1 */ strcpy (read_file, "datalist.mb-1"); /* set up the default list controls (lon, lat, along-track distance, center beam depth) */ list[0]='t'; list[1]='M'; list[2]='X'; list[3]='Y'; list[4]='H'; list[5]='s'; n_list = 6; sprintf(delimiter, "\t"); decimate = 1; /* process argument list */ while ((c = getopt(argc, argv, "AaB:b:D:d:E:e:F:f:G:g:I:i:K:k:L:l:N:n:O:o:R:r:S:s:T:t:Z:z:VvHh")) != -1) switch (c) { case 'H': case 'h': help++; break; case 'V': case 'v': verbose++; break; case 'A': case 'a': ascii = MB_NO; flag++; break; case 'B': case 'b': sscanf (optarg,"%d/%d/%d/%d/%d/%d", &btime_i[0],&btime_i[1],&btime_i[2], &btime_i[3],&btime_i[4],&btime_i[5]); btime_i[6] = 0; flag++; break; case 'D': case 'd': sscanf (optarg,"%d", &decimate); flag++; break; case 'E': case 'e': sscanf (optarg,"%d/%d/%d/%d/%d/%d", &etime_i[0],&etime_i[1],&etime_i[2], &etime_i[3],&etime_i[4],&etime_i[5]); etime_i[6] = 0; flag++; break; case 'F': case 'f': sscanf (optarg,"%d", &format); flag++; break; case 'G': case 'g': sscanf (optarg,"%s", delimiter); flag++; break; case 'I': case 'i': sscanf (optarg,"%s", read_file); flag++; break; case 'K': case 'k': sscanf (optarg,"%d", &data_kind); flag++; break; case 'L': case 'l': sscanf (optarg,"%d", &lonflip); flag++; break; case 'N': case 'n': sscanf (optarg,"%d", &aux_nav_channel); flag++; break; case 'O': case 'o': for(j=0,n_list=0;j<(int)strlen(optarg);j++,n_list++) if (n_list<MAX_OPTIONS) list[n_list] = optarg[j]; flag++; break; case 'R': case 'r': mb_get_bounds(optarg, bounds); flag++; break; case 'S': case 's': sscanf (optarg,"%lf", &speedmin); flag++; break; case 'T': case 't': sscanf (optarg,"%lf", &timegap); flag++; break; case 'Z': case 'z': segment = MB_YES; sscanf (optarg,"%s", segment_tag); flag++; break; case '?': errflg++; } /* if error flagged then print it and exit */ if (errflg) { fprintf(stderr,"usage: %s\n", usage_message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); error = MB_ERROR_BAD_USAGE; exit(error); } /* print starting message */ if (verbose == 1 || help) { fprintf(stderr,"\nProgram %s\n",program_name); fprintf(stderr,"MB-system Version %s\n",MB_VERSION); } /* print starting debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Program <%s>\n",program_name); fprintf(stderr,"dbg2 MB-system Version %s\n",MB_VERSION); fprintf(stderr,"dbg2 Control Parameters:\n"); fprintf(stderr,"dbg2 verbose: %d\n",verbose); fprintf(stderr,"dbg2 help: %d\n",help); fprintf(stderr,"dbg2 format: %d\n",format); fprintf(stderr,"dbg2 pings: %d\n",pings); fprintf(stderr,"dbg2 lonflip: %d\n",lonflip); fprintf(stderr,"dbg2 decimate: %d\n",decimate); fprintf(stderr,"dbg2 bounds[0]: %f\n",bounds[0]); fprintf(stderr,"dbg2 bounds[1]: %f\n",bounds[1]); fprintf(stderr,"dbg2 bounds[2]: %f\n",bounds[2]); fprintf(stderr,"dbg2 bounds[3]: %f\n",bounds[3]); fprintf(stderr,"dbg2 btime_i[0]: %d\n",btime_i[0]); fprintf(stderr,"dbg2 btime_i[1]: %d\n",btime_i[1]); fprintf(stderr,"dbg2 btime_i[2]: %d\n",btime_i[2]); fprintf(stderr,"dbg2 btime_i[3]: %d\n",btime_i[3]); fprintf(stderr,"dbg2 btime_i[4]: %d\n",btime_i[4]); fprintf(stderr,"dbg2 btime_i[5]: %d\n",btime_i[5]); fprintf(stderr,"dbg2 btime_i[6]: %d\n",btime_i[6]); fprintf(stderr,"dbg2 etime_i[0]: %d\n",etime_i[0]); fprintf(stderr,"dbg2 etime_i[1]: %d\n",etime_i[1]); fprintf(stderr,"dbg2 etime_i[2]: %d\n",etime_i[2]); fprintf(stderr,"dbg2 etime_i[3]: %d\n",etime_i[3]); fprintf(stderr,"dbg2 etime_i[4]: %d\n",etime_i[4]); fprintf(stderr,"dbg2 etime_i[5]: %d\n",etime_i[5]); fprintf(stderr,"dbg2 etime_i[6]: %d\n",etime_i[6]); fprintf(stderr,"dbg2 speedmin: %f\n",speedmin); fprintf(stderr,"dbg2 timegap: %f\n",timegap); fprintf(stderr,"dbg2 aux_nav_channel:%d\n",aux_nav_channel); fprintf(stderr,"dbg2 data_kind: %d\n",data_kind); fprintf(stderr,"dbg2 ascii: %d\n",ascii); fprintf(stderr,"dbg2 segment: %d\n",segment); fprintf(stderr,"dbg2 segment_tag: %s\n",segment_tag); fprintf(stderr,"dbg2 delimiter: %s\n",delimiter); fprintf(stderr,"dbg2 file: %s\n",file); fprintf(stderr,"dbg2 n_list: %d\n",n_list); for (i=0;i<n_list;i++) fprintf(stderr,"dbg2 list[%d]: %c\n", i,list[i]); } /* if help desired then print it and exit */ if (help) { fprintf(stderr,"\n%s\n",help_message); fprintf(stderr,"\nusage: %s\n", usage_message); exit(error); } /* get format if required */ if (format == 0) mb_get_format(verbose,read_file,NULL,&format,&error); /* determine whether to read one file or a list of files */ if (format < 0) read_datalist = MB_YES; /* open file list */ if (read_datalist == MB_YES) { if ((status = mb_datalist_open(verbose,&datalist, read_file,look_processed,&error)) != MB_SUCCESS) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open data list file: %s\n", read_file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } /* else copy single filename to be read */ else { strcpy(file, read_file); read_data = MB_YES; } /* loop over all files to be read */ while (read_data == MB_YES) { /* check format and get data sources */ if ((status = mb_format_source(verbose, &format, &nav_source, &heading_source, &vru_source, &svp_source, &error)) == MB_FAILURE) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error returned from function <mb_format_source>:\n%s\n",message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* set auxilliary nav source if requested - note this is superceded by data_kind if the -K option is used */ if (aux_nav_channel > 0) { if (aux_nav_channel == 1) nav_source = MB_DATA_NAV1; else if (aux_nav_channel == 2) nav_source = MB_DATA_NAV2; else if (aux_nav_channel == 3) nav_source = MB_DATA_NAV3; } /* initialize reading the swath file */ if ((status = mb_read_init( verbose,file,format,pings,lonflip,bounds, btime_i,etime_i,speedmin,timegap, &mbio_ptr,&btime_d,&etime_d, &beams_bath,&beams_amp,&pixels_ss,&error)) != MB_SUCCESS) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error returned from function <mb_read_init>:\n%s\n",message); fprintf(stderr,"\nMultibeam File <%s> not initialized for reading\n",file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* allocate memory for data arrays */ if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(char), (void **)&beamflag, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bath, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_AMPLITUDE, sizeof(double), (void **)&, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathalongtrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ss, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssalongtrack, &error); /* if error initializing memory then quit */ if (error != MB_ERROR_NO_ERROR) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error allocating data arrays:\n%s\n", message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* output separator for GMT style segment file output */ if (segment == MB_YES && ascii == MB_YES) { printf("%s\n", segment_tag); } /* read and print data */ distance_total = 0.0; nread = 0; nnav = 0; first = MB_YES; while (error <= MB_ERROR_NO_ERROR) { /* read a ping of data */ status = mb_get_all(verbose,mbio_ptr,&store_ptr,&kind, time_i,&time_d,&navlon,&navlat, &speed,&heading, &distance,&altitude,&sonardepth, &beams_bath,&beams_amp,&pixels_ss, beamflag,bath,amp,bathacrosstrack,bathalongtrack, ss,ssacrosstrack,ssalongtrack, comment,&error); /* time gaps are not a problem here */ if (error == MB_ERROR_TIME_GAP) { error = MB_ERROR_NO_ERROR; status = MB_SUCCESS; } /* check for appropriate navigation record */ /* if the -K option is used look for a particular sort of data record */ if (error <= MB_ERROR_NO_ERROR && data_kind > 0) { if (error <= MB_ERROR_NO_ERROR && kind == data_kind) { error = MB_ERROR_NO_ERROR; status = MB_SUCCESS; } else { error = MB_ERROR_IGNORE; status = MB_FAILURE; } } else if (error <= MB_ERROR_NO_ERROR && kind != nav_source) { error = MB_ERROR_IGNORE; status = MB_FAILURE; } else if (error <= MB_ERROR_NO_ERROR && kind == nav_source) { error = MB_ERROR_NO_ERROR; status = MB_SUCCESS; } /* extract additional nav info */ if (error == MB_ERROR_NO_ERROR) status = mb_extract_nnav(verbose,mbio_ptr,store_ptr, MB_ASYNCH_SAVE_MAX, &kind, &n, atime_i,atime_d,anavlon,anavlat, aspeed,aheading,adraft, aroll,apitch,aheave,&error); /* increment counter */ if (error == MB_ERROR_NO_ERROR) nread++; /* print debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Nsv data read in program <%s>\n", program_name); fprintf(stderr,"dbg2 kind: %d\n",kind); fprintf(stderr,"dbg2 error: %d\n",error); fprintf(stderr,"dbg2 status: %d\n",status); fprintf(stderr,"dbg2 n: %d\n",n); } /* loop over the n navigation points, outputting each one */ /* calculate course made good and distance */ if (error == MB_ERROR_NO_ERROR && n > 0) { for (inav=0;inav<n;inav++) { /* get data */ for (j=0;j<7;j++) time_i[j] = atime_i[inav * 7 + j]; time_d = atime_d[inav]; navlon = anavlon[inav]; navlat = anavlat[inav]; speed = aspeed[inav]; heading = aheading[inav]; draft = adraft[inav]; roll = aroll[inav]; pitch = apitch[inav]; heave = aheave[inav]; /*fprintf(stdout, "kind:%d error:%d %d of %d: time:%4d/%2d/%2d %2.2d:%2.2d:%2.2d.%6.6d\n", kind, error, i, n, time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5], time_i[6]);*/ /* calculate course made good and distance */ mb_coor_scale(verbose,navlat, &mtodeglon, &mtodeglat); headingx = sin(DTR * heading); headingy = cos(DTR * heading); if (first == MB_YES) { time_interval = 0.0; course = heading; speed_made_good = 0.0; course_old = heading; speed_made_good_old = speed; distance = 0.0; } else { time_interval = time_d - time_d_old; dx = (navlon - navlon_old)/mtodeglon; dy = (navlat - navlat_old)/mtodeglat; distance = sqrt(dx*dx + dy*dy); if (distance > 0.0) course = RTD*atan2(dx/distance,dy/distance); else course = course_old; if (course < 0.0) course = course + 360.0; if (time_interval > 0.0) speed_made_good = 3.6*distance/time_interval; else speed_made_good = speed_made_good_old; } distance_total += 0.001 * distance; /* reset old values */ navlon_old = navlon; navlat_old = navlat; course_old = course; speed_made_good_old = speed_made_good; time_d_old = time_d; /* now loop over list of output parameters */ if (nnav % decimate == 0) for (i=0; i<n_list; i++) { switch (list[i]) { case '/': /* Inverts next simple value */ invert_next_value = MB_YES; break; case '-': /* Flip sign on next simple value */ signflip_next_value = MB_YES; break; case 'c': /* Sonar transducer depth (m) */ printsimplevalue(verbose, sonardepth, 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'H': /* heading */ printsimplevalue(verbose, heading, 6, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'h': /* course */ printsimplevalue(verbose, course, 6, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'J': /* time string */ mb_get_jtime(verbose,time_i,time_j); if (ascii == MB_YES) { printf("%.4d %.3d %.2d %.2d %.2d.%6.6d", time_j[0],time_j[1], time_i[3],time_i[4], time_i[5],time_i[6]); } else { b = time_j[0]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[1]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[3]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[4]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[5]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[6]; fwrite(&b, sizeof(double), 1, stdout); } break; case 'j': /* time string */ mb_get_jtime(verbose,time_i,time_j); if (ascii == MB_YES) { printf("%.4d %.3d %.4d %.2d.%6.6d", time_j[0],time_j[1], time_j[2],time_j[3],time_j[4]); } else { b = time_j[0]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[1]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[2]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[3]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[4]; fwrite(&b, sizeof(double), 1, stdout); } break; case 'L': /* along-track distance (km) */ printsimplevalue(verbose, distance_total, 7, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'l': /* along-track distance (m) */ printsimplevalue(verbose, 1000.0 * distance_total, 7, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'M': /* Decimal unix seconds since 1/1/70 00:00:00 */ printsimplevalue(verbose, time_d, 0, 6, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'm': /* time in decimal seconds since first record */ if (first_m == MB_YES) { time_d_ref = time_d; first_m = MB_NO; } b = time_d - time_d_ref; printsimplevalue(verbose, b, 0, 6, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'P': /* pitch */ printsimplevalue(verbose, pitch, 5, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'p': /* draft */ printsimplevalue(verbose, draft, 5, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'R': /* roll */ printsimplevalue(verbose, roll, 5, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'r': /* heave */ printsimplevalue(verbose, heave, 5, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'S': /* speed */ printsimplevalue(verbose, speed, 5, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 's': /* speed made good */ printsimplevalue(verbose, speed_made_good, 5, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'T': /* yyyy/mm/dd/hh/mm/ss time string */ if (ascii == MB_YES) printf("%.4d/%.2d/%.2d/%.2d/%.2d/%.2d.%.6d", time_i[0],time_i[1],time_i[2], time_i[3],time_i[4],time_i[5], time_i[6]); else { b = time_i[0]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[1]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[2]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[3]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[4]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[5] + 1e-6 * time_i[6]; fwrite(&b, sizeof(double), 1, stdout); } break; case 't': /* yyyy mm dd hh mm ss time string */ if (ascii == MB_YES) printf("%.4d %.2d %.2d %.2d %.2d %.2d.%.6d", time_i[0],time_i[1],time_i[2], time_i[3],time_i[4],time_i[5], time_i[6]); else { b = time_i[0]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[1]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[2]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[3]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[4]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[5] + 1e-6 * time_i[6]; fwrite(&b, sizeof(double), 1, stdout); } break; case 'U': /* unix time in seconds since 1/1/70 00:00:00 */ time_u = (int) time_d; if (ascii == MB_YES) printf("%ld",time_u); else { b = time_u; fwrite(&b, sizeof(double), 1, stdout); } break; case 'u': /* time in seconds since first record */ time_u = (int) time_d; if (first_u == MB_YES) { time_u_ref = time_u; first_u = MB_NO; } if (ascii == MB_YES) printf("%ld",time_u - time_u_ref); else { b = time_u - time_u_ref; fwrite(&b, sizeof(double), 1, stdout); } break; case 'V': /* time in seconds since last ping */ case 'v': if (ascii == MB_YES) { if ( fabs(time_interval) > 100. ) printf("%g",time_interval); else printf("%7.3f",time_interval); } else { fwrite(&time_interval, sizeof(double), 1, stdout); } break; case 'X': /* longitude decimal degrees */ dlon = navlon; printsimplevalue(verbose, dlon, 14, 9, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'x': /* longitude degress + decimal minutes */ dlon = navlon; if (dlon < 0.0) { hemi = 'W'; dlon = -dlon; } else hemi = 'E'; degrees = (int) dlon; minutes = 60.0*(dlon - degrees); if (ascii == MB_YES) { printf("%3d %9.6f%c", degrees, minutes, hemi); } else { b = degrees; if (hemi == 'W') b = -b; fwrite(&b, sizeof(double), 1, stdout); b = minutes; fwrite(&b, sizeof(double), 1, stdout); } break; case 'Y': /* latitude decimal degrees */ dlat = navlat; printsimplevalue(verbose, dlat, 14, 9, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'y': /* latitude degrees + decimal minutes */ dlat = navlat; if (dlat < 0.0) { hemi = 'S'; dlat = -dlat; } else hemi = 'N'; degrees = (int) dlat; minutes = 60.0*(dlat - degrees); if (ascii == MB_YES) { printf("%3d %9.6f%c", degrees, minutes, hemi); } else { b = degrees; if (hemi == 'S') b = -b; fwrite(&b, sizeof(double), 1, stdout); b = minutes; fwrite(&b, sizeof(double), 1, stdout); } break; default: if (ascii == MB_YES) printf("<Invalid Option: %c>", list[i]); break; } if (ascii == MB_YES) { if (i<(n_list-1)) printf ("%s", delimiter); else printf ("\n"); } } nnav++; first = MB_NO; } } } /* close the swath file */ status = mb_close(verbose,&mbio_ptr,&error); /* figure out whether and what to read next */ if (read_datalist == MB_YES) { if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } else { read_data = MB_NO; } /* end loop over files in list */ } if (read_datalist == MB_YES) mb_datalist_close(verbose,&datalist,&error); /* check memory */ if (verbose >= 4) status = mb_memory_list(verbose,&error); /* print output debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Program <%s> completed\n", program_name); fprintf(stderr,"dbg2 Ending status:\n"); fprintf(stderr,"dbg2 status: %d\n",status); } /* end it all */ exit(error); }
int main ( int argc, char **argv ) { static char program_name[] = "mbotps"; static char help_message[] = "MBotps predicts tides using methods and data derived from the OSU Tidal Prediction Software (OTPS) distributions."; static char usage_message[] = "mbotps [-Atideformat -Byear/month/day/hour/minute/second -Ctidestationformat\n" "\t-Dinterval -Eyear/month/day/hour/minute/second -Fformat\n" "\t-Idatalist -Lopts_path -Ntidestationfile -Ooutput -Potps_location\n" "\t-Rlon/lat -S -Tmodel -Utidestationlon/tidestationlat -V]"; extern char *optarg; int errflg = 0; int c; int help = 0; int flag = 0; /* MBIO status variables */ int status = MB_SUCCESS; int verbose = 0; int error = MB_ERROR_NO_ERROR; char *message; /* MBIO read control parameters */ int read_datalist = MB_NO; mb_path read_file; void *datalist; int look_processed = MB_DATALIST_LOOK_UNSET; double file_weight; mb_path swath_file; mb_path file; mb_path dfile; int format; int pings; int lonflip; double bounds[4]; double speedmin; double timegap; int beams_bath; int beams_amp; int pixels_ss; /* MBIO read values */ void *mbio_ptr = NULL; void *store_ptr = NULL; int kind; int time_i[7]; double time_d; double navlon; double navlat; double speed; double heading; double distance; double altitude; double sonardepth; char *beamflag = NULL; double *bath = NULL; double *bathacrosstrack = NULL; double *bathalongtrack = NULL; double *amp = NULL; double *ss = NULL; double *ssacrosstrack = NULL; double *ssalongtrack = NULL; char comment[MB_COMMENT_MAXLINE]; /* mbotps control parameters */ mb_path otps_location_use; int notpsmodels = 0; int nmodeldatafiles = 0; int mbotps_mode = MBOTPS_MODE_POSITION; double tidelon; double tidelat; double btime_d; double etime_d; int btime_i[7]; int etime_i[7]; double interval = 300.0; mb_path tide_file; int mbprocess_update = MB_NO; int skip_existing = MB_NO; int tideformat = 2; int ngood; /* tide station data */ mb_path tidestation_file; double tidestation_lon = 0.0; double tidestation_lat = 0.0; int tidestation_format = 2; int tidestation_ok = MB_NO; int ntidestation = 0; double *tidestation_time_d = NULL; double *tidestation_tide = NULL; double *tidestation_model = NULL; double *tidestation_correction = NULL; int time_j[5]; int tidestation_stime_i[7], tidestation_etime_i[7]; double tidestation_stime_d, tidestation_etime_d; double tidestation_d_min, tidestation_d_max; double tidestation_m_min, tidestation_m_max; double tidestation_c_min, tidestation_c_max; int ihr, intstat, itime; int size; double sec, correction; /* time parameters */ time_t right_now; char date[32], user[MB_PATH_MAXLINE], *user_ptr, host[MB_PATH_MAXLINE]; int pid; FILE *tfp, *mfp, *ofp; struct stat file_status; int fstat; double start_time_d; double end_time_d; int istart, iend; int proceed = MB_YES; int input_size, input_modtime, output_size, output_modtime; mb_path lltfile = ""; mb_path otpsfile = ""; mb_path line = ""; mb_path predict_tide = ""; int otps_model_set = MB_NO; mb_path otps_model = ""; mb_path modelname = ""; mb_path modelfile = ""; mb_path modeldatafile = ""; int read_data; int ntime; int nread; int nline; int nget; int output; double savetime_d; double lasttime_d; double lastlon; double lastlat; double lon; double lat; double tide; double depth; char *result; int i; /* get current default values */ status = mb_defaults(verbose, &format, &pings, &lonflip, bounds, btime_i, etime_i, &speedmin, &timegap); /* set default input to datalist.mb-1 */ strcpy(read_file, "datalist.mb-1"); /* set default location of the OTPS package */ strcpy(otps_location_use, otps_location); /* set defaults for the AUV survey we were running on Coaxial Segment, Juan de Fuca Ridge while I wrote this code */ sprintf(otps_model, MBOTPS_DEFAULT_MODEL); sprintf(tide_file, "tide_model.txt"); tidelon = -129.588618; tidelat = 46.50459; interval = 60.0; btime_i[0] = 2009; btime_i[1] = 7; btime_i[2] = 31; btime_i[3] = 0; btime_i[4] = 0; btime_i[5] = 0; btime_i[6] = 0; etime_i[0] = 2009; etime_i[1] = 8; etime_i[2] = 2; etime_i[3] = 1; etime_i[4] = 0; etime_i[5] = 0; etime_i[6] = 0; /* process argument list */ while ((c = getopt(argc, argv, "A:a:B:b:C:c:D:d:E:e:F:f:I:i:MmN:n:O:o:P:p:R:r:SST:t:U:u:VvHh")) != -1) switch (c) { case 'H': case 'h': help++; break; case 'V': case 'v': verbose++; break; case 'A': case 'a': sscanf(optarg, "%d", &tideformat); if (tideformat != 2) tideformat = 1; break; case 'B': case 'b': sscanf(optarg, "%d/%d/%d/%d/%d/%d", &btime_i[0], &btime_i[1], &btime_i[2], &btime_i[3], &btime_i[4], &btime_i[5]); btime_i[6] = 0; flag++; break; case 'C': case 'c': sscanf(optarg, "%d", &tidestation_format); if (tidestation_format < 1 || tidestation_format > 4) tidestation_format = 2; break; case 'D': case 'd': sscanf(optarg, "%lf", &interval); break; case 'E': case 'e': sscanf(optarg, "%d/%d/%d/%d/%d/%d", &etime_i[0], &etime_i[1], &etime_i[2], &etime_i[3], &etime_i[4], &etime_i[5]); etime_i[6] = 0; flag++; break; case 'F': case 'f': sscanf(optarg, "%d", &format); flag++; break; case 'I': case 'i': sscanf(optarg, "%s", read_file); mbotps_mode = mbotps_mode | MBOTPS_MODE_NAVIGATION; flag++; break; case 'M': case 'm': mbprocess_update = MB_YES; break; case 'N': case 'n': sscanf(optarg, "%s", tidestation_file); mbotps_mode = mbotps_mode | MBOTPS_MODE_TIDESTATION; break; case 'O': case 'o': sscanf(optarg, "%s", tide_file); break; case 'P': case 'p': sscanf(optarg, "%s", otps_location_use); break; case 'R': case 'r': sscanf(optarg, "%lf/%lf", &tidelon, &tidelat); break; case 'S': case 's': skip_existing = MB_YES; break; case 'T': case 't': sscanf(optarg, "%s", otps_model); otps_model_set = MB_YES; break; case 'U': case 'u': sscanf(optarg, "%lf/%lf", &tidestation_lon, &tidestation_lat); break; case '?': errflg++; } /* if error flagged then print it and exit */ if (errflg) { fprintf(stderr, "usage: %s\n", usage_message); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); error = MB_ERROR_BAD_USAGE; exit(error); } /* print starting message */ if (( verbose == 1) || help) { fprintf(stderr, "\nProgram %s\n", program_name); fprintf(stderr, "MB-system Version %s\n", MB_VERSION); } /* if help desired then print it and exit */ if (help) { fprintf(stderr, "\n%s\n", help_message); fprintf(stderr, "\nusage: %s\n", usage_message); } /* Check for available tide models */ if (help || ( verbose > 0) ) { fprintf(stderr, "\nChecking for available OTPS tide models\n"); fprintf(stderr, "OTPS location: %s\nValid OTPS tidal models:\n", otps_location_use); } notpsmodels = 0; sprintf(line, "/bin/ls -1 %s/DATA | grep Model_ | sed \"s/^Model_//\"", otps_location_use); if ((tfp = popen(line, "r")) != NULL) { /* send relevant input to predict_tide through its stdin stream */ while (fgets(line, sizeof(line), tfp)) { sscanf(line, "%s", modelname); sprintf(modelfile, "%s/DATA/Model_%s", otps_location_use, modelname); nmodeldatafiles = 0; /* check the files referenced in the model file */ if ((mfp = fopen(modelfile, "r")) != NULL) { /* stat the file referenced in each line */ while (fgets(modeldatafile, MB_PATH_MAXLINE, mfp) != NULL) { if (strlen(modeldatafile) > 0) modeldatafile[strlen(modeldatafile) - 1] = '\0'; if (( (fstat = stat(modeldatafile, &file_status)) == 0) && ( (file_status.st_mode & S_IFMT) != S_IFDIR) ) nmodeldatafiles++; } fclose(mfp); } if (nmodeldatafiles >= 3) { if (help || ( verbose > 0) ) fprintf(stderr, " %s\n", modelname); if (otps_model_set == MB_NO) if (( notpsmodels == 0) || ( strcmp(modelname, MBOTPS_DEFAULT_MODEL) == 0) ) strcpy(otps_model, modelname); notpsmodels++; } } /* close the process */ pclose(tfp); } else { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open ls using popen()\n"); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } if (help || ( verbose > 0) ) { fprintf(stderr, "Number of available OTPS tide models: %d\n", notpsmodels); fprintf(stderr, "\nUsing OTPS tide model: %s\n", otps_model); } /* print starting debug statements */ if (verbose >= 2) { fprintf(stderr, "\ndbg2 Program <%s>\n", program_name); fprintf(stderr, "dbg2 MB-system Version %s\n", MB_VERSION); fprintf(stderr, "dbg2 Control Parameters:\n"); fprintf(stderr, "dbg2 verbose: %d\n", verbose); fprintf(stderr, "dbg2 help: %d\n", help); fprintf(stderr, "dbg2 otps_location: %s\n", otps_location); fprintf(stderr, "dbg2 otps_location_use: %s\n", otps_location_use); fprintf(stderr, "dbg2 otps_model_set: %d\n", otps_model_set); fprintf(stderr, "dbg2 otps_model: %s\n", otps_model); fprintf(stderr, "dbg2 mbotps_mode: %d\n", mbotps_mode); fprintf(stderr, "dbg2 tidelon: %f\n", tidelon); fprintf(stderr, "dbg2 tidelat: %f\n", tidelat); fprintf(stderr, "dbg2 tidestation_file: %s\n", tidestation_file); fprintf(stderr, "dbg2 tidestation_lon: %f\n", tidestation_lon); fprintf(stderr, "dbg2 tidestation_lat: %f\n", tidestation_lat); fprintf(stderr, "dbg2 tidestation_format: %d\n", tidestation_format); fprintf(stderr, "dbg2 btime_i[0]: %d\n", btime_i[0]); fprintf(stderr, "dbg2 btime_i[1]: %d\n", btime_i[1]); fprintf(stderr, "dbg2 btime_i[2]: %d\n", btime_i[2]); fprintf(stderr, "dbg2 btime_i[3]: %d\n", btime_i[3]); fprintf(stderr, "dbg2 btime_i[4]: %d\n", btime_i[4]); fprintf(stderr, "dbg2 btime_i[5]: %d\n", btime_i[5]); fprintf(stderr, "dbg2 btime_i[6]: %d\n", btime_i[6]); fprintf(stderr, "dbg2 etime_i[0]: %d\n", etime_i[0]); fprintf(stderr, "dbg2 etime_i[1]: %d\n", etime_i[1]); fprintf(stderr, "dbg2 etime_i[2]: %d\n", etime_i[2]); fprintf(stderr, "dbg2 etime_i[3]: %d\n", etime_i[3]); fprintf(stderr, "dbg2 etime_i[4]: %d\n", etime_i[4]); fprintf(stderr, "dbg2 etime_i[5]: %d\n", etime_i[5]); fprintf(stderr, "dbg2 etime_i[6]: %d\n", etime_i[6]); fprintf(stderr, "dbg2 interval: %f\n", interval); fprintf(stderr, "dbg2 tide_file: %s\n", tide_file); fprintf(stderr, "dbg2 mbprocess_update: %d\n", mbprocess_update); fprintf(stderr, "dbg2 skip_existing: %d\n", skip_existing); fprintf(stderr, "dbg2 tideformat: %d\n", tideformat); fprintf(stderr, "dbg2 format: %d\n", format); fprintf(stderr, "dbg2 read_file: %s\n", read_file); } /* exit if no valid OTPS models can be found */ if (notpsmodels <= 0) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to find a valid OTPS tidal model\n"); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* if help was all that was desired then exit */ if (help) exit(error); /* ------------------------------------------------------------------------- * if specified read in tide station data and calculate model values for the * same location and times- the difference is applied as a correction to the * model values calculated at the desired locations and times * -----------------------------------------------------------------------*/ if (mbotps_mode & MBOTPS_MODE_TIDESTATION) { /* make sure longitude is positive */ if (tidestation_lon < 0.0) tidestation_lon += 360.0; /* open the tide station data file */ if ((tfp = fopen(tidestation_file, "r")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open tide station file <%s> for writing\n", tidestation_file); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* count the lines in the tide station data */ ntidestation = 0; while ((result = fgets(line, MB_PATH_MAXLINE, tfp)) == line) ntidestation++; rewind(tfp); /* allocate memory for tide station arrays */ size = ntidestation * sizeof(double); status =mb_mallocd(verbose, __FILE__, __LINE__, size, (void **)&tidestation_time_d, &error); if (error == MB_ERROR_NO_ERROR) status = mb_mallocd(verbose, __FILE__, __LINE__, size, (void **)&tidestation_tide, &error); if (error == MB_ERROR_NO_ERROR) status = mb_mallocd(verbose, __FILE__, __LINE__, size, (void **)&tidestation_model, &error); if (error == MB_ERROR_NO_ERROR) status = mb_mallocd(verbose, __FILE__, __LINE__, size, (void **)&tidestation_correction, &error); if (error != MB_ERROR_NO_ERROR) { mb_error(verbose, error, &message); fprintf(stderr, "\nMBIO Error allocating data arrays:\n%s\n", message); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(error); } /* read the tide station data in the specified format */ ntidestation = 0; while ((result = fgets(line, MB_PATH_MAXLINE, tfp)) == line) { tidestation_ok = MB_NO; /* ignore comments */ if (line[0] != '#') { /* deal with tide station data in form: time_d tide */ if (tidestation_format == 1) { nget = sscanf(line, "%lf %lf", &tidestation_time_d[ntidestation], &tidestation_tide[ntidestation]); if (nget == 2) tidestation_ok = MB_YES; } /* deal with tide station data in form: yr mon day hour min sec tide */ else if (tidestation_format == 2) { nget = sscanf(line, "%d %d %d %d %d %lf %lf", &time_i[0], &time_i[1], &time_i[2], &time_i[3], &time_i[4], &sec, &tidestation_tide[ntidestation]); time_i[5] = (int)sec; time_i[6] = 1000000 * (sec - time_i[5]); mb_get_time(verbose, time_i, &time_d); tidestation_time_d[ntidestation] = time_d; if (nget == 7) tidestation_ok = MB_YES; } /* deal with tide station data in form: yr jday hour min sec tide */ else if (tidestation_format == 3) { nget = sscanf(line, "%d %d %d %d %lf %lf", &time_j[0], &time_j[1], &ihr, &time_j[2], &sec, &tidestation_tide[ntidestation]); time_j[2] = time_j[2] + 60 * ihr; time_j[3] = (int)sec; time_j[4] = 1000000 * (sec - time_j[3]); mb_get_itime(verbose, time_j, time_i); mb_get_time(verbose, time_i, &time_d); tidestation_time_d[ntidestation] = time_d; if (nget == 6) tidestation_ok = MB_YES; } /* deal with tide station data in form: yr jday daymin sec tide */ else if (tidestation_format == 4) { nget = sscanf(line, "%d %d %d %lf %lf", &time_j[0], &time_j[1], &time_j[2], &sec, &tidestation_tide[ntidestation]); time_j[3] = (int)sec; time_j[4] = 1000000 * (sec - time_j[3]); mb_get_itime(verbose, time_j, time_i); mb_get_time(verbose, time_i, &time_d); tidestation_time_d[ntidestation] = time_d; if (nget == 5) tidestation_ok = MB_YES; } } /* output some debug values */ if ((verbose >= 5) && (tidestation_ok == MB_YES)) { fprintf(stderr, "\ndbg5 New tide point read in program <%s>\n", program_name); fprintf(stderr, "dbg5 tide[%d]: %f %f\n", ntidestation, tidestation_time_d[ntidestation], tidestation_tide[ntidestation]); } else if (verbose >= 5) { fprintf(stderr, "\ndbg5 Error parsing line in tide file in program <%s>\n", program_name); fprintf(stderr, "dbg5 line: %s\n", line); } /* check for reverses or repeats in time */ if (tidestation_ok == MB_YES) { if (ntidestation == 0) { ntidestation++; } else if (tidestation_time_d[ntidestation] > tidestation_time_d[ntidestation - 1]) { ntidestation++; } else if ((ntidestation > 0) && ( tidestation_time_d[ntidestation] <= tidestation_time_d[ntidestation - 1]) && ( verbose >= 5) ) { fprintf(stderr, "\ndbg5 Tide time error in program <%s>\n", program_name); fprintf(stderr, "dbg5 tide[%d]: %f %f\n", ntidestation - 1, tidestation_time_d[ntidestation - 1], tidestation_tide[ntidestation - 1]); fprintf(stderr, "dbg5 tide[%d]: %f %f\n", ntidestation, tidestation_time_d[ntidestation], tidestation_tide[ntidestation]); } } strncpy(line, "\0", sizeof(line)); } fclose(tfp); /* now get time and tide model values at the tide station location first open temporary file of lat lon time*/ pid = getpid(); sprintf(lltfile, "tmp_mbotps_llt_%d.txt", pid); sprintf(otpsfile, "tmp_mbotps_llttd_%d.txt", pid); if ((tfp = fopen(lltfile, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open temporary lat-lon-time file <%s> for writing\n", lltfile); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } else { for (i = 0; i < ntidestation; i++) { mb_get_date(verbose, tidestation_time_d[i], time_i); fprintf(tfp, "%.6f %.6f %4.4d %2.2d %2.2d %2.2d %2.2d %2.2d\n", tidestation_lat, tidestation_lon, time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5]); } fclose(tfp); } /* call predict_tide with popen */ sprintf(predict_tide, "%s/predict_tide", otps_location_use); if ((tfp = popen(predict_tide, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open predict_time program using popen()\n"); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* send relevant input to predict_tide through its stdin stream */ fprintf(tfp, "%s/DATA/Model_%s\n", otps_location_use, otps_model); fprintf(tfp, "%s\n", lltfile); fprintf(tfp, "z\n\nAP\noce\n1\n"); /*fprintf(tfp, "z\nm2,s2,n2,k2,k1,o1,p1,q1\nAP\noce\n1\n");*/ fprintf(tfp, "%s\n", otpsfile); /* close the process */ pclose(tfp); /* now read results from predict_tide and rewrite them in a useful form */ if ((tfp = fopen(otpsfile, "r")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open predict_time results temporary file <%s>\n", otpsfile); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } nline = 0; ngood = 0; while ((result = fgets(line, MB_PATH_MAXLINE, tfp)) == line) { nline++; if (nline > 6) { nget = sscanf(line, "%lf %lf %d.%d.%d %d:%d:%d %lf %lf", &lat, &lon, &time_i[1], &time_i[2], &time_i[0], &time_i[3], &time_i[4], &time_i[5], &tide, &depth); if (nget == 10) { tidestation_model[ngood] = tide; tidestation_correction[ngood] = tidestation_tide[ngood] - tidestation_model[ngood]; ngood++; } } } fclose(tfp); if (ngood != ntidestation) { error = MB_ERROR_BAD_FORMAT; fprintf(stderr, "\nNumber of tide station values does not match number of model values <%d != %d>\n", ntidestation, ngood); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* get start end min max of tide station data */ tidestation_d_min = 0.0; tidestation_d_max = 0.0; tidestation_m_min = 0.0; tidestation_m_max = 0.0; tidestation_c_min = 0.0; tidestation_c_max = 0.0; for (i = 0; i < ntidestation; i++) { if (i == 0) { tidestation_d_min = tidestation_tide[i]; tidestation_d_max = tidestation_tide[i]; tidestation_m_min = tidestation_model[i]; tidestation_m_max = tidestation_model[i]; tidestation_c_min = tidestation_correction[i]; tidestation_c_max = tidestation_correction[i]; tidestation_stime_d = tidestation_time_d[i]; } else { tidestation_d_min = MIN(tidestation_tide[i], tidestation_d_min); tidestation_d_max = MAX(tidestation_tide[i], tidestation_d_max); tidestation_m_min = MIN(tidestation_model[i], tidestation_m_min); tidestation_m_max = MAX(tidestation_model[i], tidestation_m_max); tidestation_c_min = MIN(tidestation_correction[i], tidestation_c_min); tidestation_c_max = MAX(tidestation_correction[i], tidestation_c_max); tidestation_etime_d = tidestation_time_d[i]; } } mb_get_date(verbose, tidestation_stime_d, tidestation_stime_i); mb_get_date(verbose, tidestation_etime_d, tidestation_etime_i); /* output info on tide station data */ if (( verbose > 0) && mbotps_mode & MBOTPS_MODE_TIDESTATION) { fprintf(stderr, "\nTide station data file: %s\n", tidestation_file); fprintf(stderr, " Tide station longitude: %f\n", tidestation_lon); fprintf(stderr, " Tide station latitude: %f\n", tidestation_lat); fprintf(stderr, " Tide station format: %d\n", tidestation_format); fprintf(stderr, " Tide station data summary:\n"); fprintf(stderr, " Number of samples: %d\n", ntidestation); fprintf(stderr, " Start time: %4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d.%6.6d\n", tidestation_stime_i[0], tidestation_stime_i[1], tidestation_stime_i[2], tidestation_stime_i[3], tidestation_stime_i[4], tidestation_stime_i[5], tidestation_stime_i[6]); fprintf(stderr, " End time: %4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d.%6.6d\n", tidestation_etime_i[0], tidestation_etime_i[1], tidestation_etime_i[2], tidestation_etime_i[3], tidestation_etime_i[4], tidestation_etime_i[5], tidestation_etime_i[6]); fprintf(stderr, " Minimum values: %7.3f %7.3f %7.3f\n", tidestation_d_min, tidestation_m_min, tidestation_c_min); fprintf(stderr, " Maximum values: %7.3f %7.3f %7.3f\n", tidestation_d_max, tidestation_m_max, tidestation_c_max); } /* remove the temporary files */ unlink(lltfile); unlink(otpsfile); } /* ------------------------------------------------------------------------- * calculate tide model for a single position and time range * -----------------------------------------------------------------------*/ if (!(mbotps_mode & MBOTPS_MODE_NAVIGATION)) { /* first open temporary file of lat lon time */ pid = getpid(); sprintf(lltfile, "tmp_mbotps_llt_%d.txt", pid); sprintf(otpsfile, "tmp_mbotps_llttd_%d.txt", pid); if ((tfp = fopen(lltfile, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open temporary lat-lon-time file <%s> for writing\n", lltfile); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* make sure longitude is positive */ if (tidelon < 0.0) tidelon += 360.0; /* loop over the time of interest generating the lat-lon-time values */ mb_get_time(verbose, btime_i, &btime_d); mb_get_time(verbose, etime_i, &etime_d); ntime = 1 + (int)floor((etime_d - btime_d) / interval); for (i = 0; i < ntime; i++) { time_d = btime_d + i * interval; mb_get_date(verbose, time_d, time_i); fprintf(tfp, "%.6f %.6f %4.4d %2.2d %2.2d %2.2d %2.2d %2.2d\n", tidelat, tidelon, time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5]); } /* close the llt file */ fclose(tfp); /* call predict_tide with popen */ sprintf(predict_tide, "%s/predict_tide", otps_location_use); if ((tfp = popen(predict_tide, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open predict_time program using popen()\n"); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* send relevant input to predict_tide through its stdin stream */ fprintf(tfp, "%s/DATA/Model_%s\n", otps_location_use, otps_model); fprintf(tfp, "%s\n", lltfile); fprintf(tfp, "z\n\nAP\noce\n1\n"); /*fprintf(tfp, "z\nm2,s2,n2,k2,k1,o1,p1,q1\nAP\noce\n1\n");*/ fprintf(tfp, "%s\n", otpsfile); /* close the process */ pclose(tfp); /* now read results from predict_tide and rewrite them in a useful form */ if ((tfp = fopen(otpsfile, "r")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open predict_time results temporary file <%s>\n", otpsfile); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } if ((ofp = fopen(tide_file, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open tide output file <%s>\n", tide_file); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } fprintf(ofp, "# Tide model generated by program %s\n", program_name); fprintf(ofp, "# MB-System Version: %s\n", MB_VERSION); fprintf(ofp, "# Tide model generated by program %s\n", program_name); fprintf(ofp, "# which in turn calls OTPS program predict_tide obtained from:\n"); fprintf(ofp, "# http://www.coas.oregonstate.edu/research/po/research/tide/\n"); fprintf(ofp, "#\n"); fprintf(ofp, "# OTPSnc tide model: \n"); fprintf(ofp, "# %s\n", otps_model); if (tideformat == 2) { fprintf(ofp, "# Output format:\n"); fprintf(ofp, "# year month day hour minute second tide\n"); fprintf(ofp, "# where tide is in meters\n"); } else { fprintf(ofp, "# Output format:\n"); fprintf(ofp, "# time_d tide\n"); fprintf(ofp, "# where time_d is in seconds since January 1, 1970\n"); fprintf(ofp, "# and tide is in meters\n"); } right_now = time((time_t *)0); strcpy(date, ctime(&right_now)); date[strlen(date) - 1] = '\0'; if ((user_ptr = getenv("USER")) == NULL) user_ptr = getenv("LOGNAME"); if (user_ptr != NULL) strcpy(user, user_ptr); else strcpy(user, "unknown"); gethostname(host, MBP_FILENAMESIZE); fprintf(ofp, "# Run by user <%s> on cpu <%s> at <%s>\n", user, host, date); /* loop over tide model values, writing them out in the specified format */ nline = 0; ngood = 0; while ((result = fgets(line, MB_PATH_MAXLINE, tfp)) == line) { nline++; if (( nline == 2) || ( nline == 3) ) { fprintf(ofp, "#%s", line); } else if (nline > 6) { nget = sscanf(line, "%lf %lf %d.%d.%d %d:%d:%d %lf %lf", &lat, &lon, &time_i[1], &time_i[2], &time_i[0], &time_i[3], &time_i[4], &time_i[5], &tide, &depth); if (nget == 10) { ngood++; /* if tide station data have been loaded, interpolate the * correction value to apply to the tide model */ if (mbotps_mode & MBOTPS_MODE_TIDESTATION && (ntidestation > 0)) { intstat = mb_linear_interp(verbose, tidestation_time_d - 1, tidestation_correction - 1, ntidestation, time_d, &correction, &itime, &error); if (intstat == MB_SUCCESS) tide += correction; /*fprintf(stderr,"TIDE STATION CORRECTION: intstat:%d itime:%dof%d time_d:%f correction:%f tide:%f\n", */ /* intstat, itime, ntidestation, time_d, correction, tide); */ } /* write out the tide model */ if (tideformat == 2) { fprintf(ofp, "%4.4d %2.2d %2.2d %2.2d %2.2d %2.2d %9.4f\n", time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5], tide); } else { mb_get_time(verbose, time_i, &time_d); fprintf(ofp, "%.3f %9.4f\n", time_d, tide); } } } } fclose(tfp); fclose(ofp); /* remove the temporary files */ unlink(lltfile); unlink(otpsfile); /* some helpful output */ fprintf(stderr, "\nResults are really in %s\n", tide_file); } /* end single position mode */ /* ------------------------------------------------------------------------- * else get tides along the navigation contained in a set of swath files * -----------------------------------------------------------------------*/ else if (mbotps_mode & MBOTPS_MODE_NAVIGATION) { /*fprintf(stderr,"Doing tide correction for swath navigation\n"); */ /* get format if required */ if (format == 0) mb_get_format(verbose, read_file, NULL, &format, &error); /* determine whether to read one file or a list of files */ if (format < 0) read_datalist = MB_YES; /* open file list */ if (read_datalist == MB_YES) { if ((status = mb_datalist_open(verbose, &datalist, read_file, look_processed, &error)) != MB_SUCCESS) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open data list file: %s\n", read_file); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(error); } if ((status = mb_datalist_read(verbose, datalist, file, dfile, &format, &file_weight, &error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } /* else copy single filename to be read */ else { strcpy(file, read_file); read_data = MB_YES; } /* loop over all files to be read */ while (read_data == MB_YES) { /* Figure out if the file needs a tide model - don't generate a new tide model if one was made previously and is up to date AND the appropriate request has been made */ proceed = MB_YES; sprintf(tide_file, "%s.tde", file); if (skip_existing == MB_YES) { if (( (fstat = stat(file, &file_status)) == 0) && ( (file_status.st_mode & S_IFMT) != S_IFDIR) ) { input_modtime = file_status.st_mtime; input_size = file_status.st_size; } else { input_modtime = 0; input_size = 0; } if (( (fstat = stat(tide_file, &file_status)) == 0) && ( (file_status.st_mode & S_IFMT) != S_IFDIR) ) { output_modtime = file_status.st_mtime; output_size = file_status.st_size; } else { output_modtime = 0; output_size = 0; } if (( output_modtime > input_modtime) && ( input_size > 0) && ( output_size > 0) ) proceed = MB_NO; } /* skip the file */ if (proceed == MB_NO) { /* some helpful output */ fprintf(stderr, "\n---------------------------------------\n\nProcessing tides for %s\n\n", file); fprintf(stderr, "Skipped - tide model file is up to date\n\n"); } /* generate the tide model */ else { /* some helpful output */ fprintf(stderr, "\n---------------------------------------\n\nProcessing tides for %s\n\n", file); /* note tide station correction */ if (mbotps_mode & MBOTPS_MODE_TIDESTATION && (ntidestation > 0)) { fprintf(stderr, "Applying tide station correction\n\n"); } /* first open temporary file of lat lon time */ pid = getpid(); strcpy(swath_file, file); sprintf(lltfile, "tmp_mbotps_llt_%d.txt", pid); sprintf(otpsfile, "tmp_mbotps_llttd_%d.txt", pid); if ((tfp = fopen(lltfile, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open temporary lat-lon-time file <%s> for writing\n", lltfile); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* read fnv file if possible */ mb_get_fnv(verbose, file, &format, &error); /* initialize reading the swath file */ if ((status = mb_read_init(verbose, file, format, pings, lonflip, bounds, btime_i, etime_i, speedmin, timegap, &mbio_ptr, &btime_d, &etime_d, &beams_bath, &beams_amp, &pixels_ss, &error)) !=MB_SUCCESS) { mb_error(verbose, error, &message); fprintf(stderr, "\nMBIO Error returned from function <mb_read_init>:\n%s\n", message); fprintf(stderr, "\nMultibeam File <%s> not initialized for reading\n", file); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(error); } /* allocate memory for data arrays */ if (error == MB_ERROR_NO_ERROR) status =mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(char), (void **)&beamflag, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bath, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_AMPLITUDE, sizeof(double), (void **)&, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathalongtrack, &error); if (error == MB_ERROR_NO_ERROR) status =mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ss, &error); if (error == MB_ERROR_NO_ERROR) status =mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status =mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssalongtrack, &error); /* if error initializing memory then quit */ if (error != MB_ERROR_NO_ERROR) { mb_error(verbose, error, &message); fprintf(stderr, "\nMBIO Error allocating data arrays:\n%s\n", message); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(error); } /* read and use data */ nread = 0; while (error <= MB_ERROR_NO_ERROR) { /* reset error */ error = MB_ERROR_NO_ERROR; output = MB_NO; /* read next data record */ status = mb_get_all(verbose, mbio_ptr, &store_ptr, &kind, time_i, &time_d, &navlon, &navlat, &speed, &heading, &distance, &altitude, &sonardepth, &beams_bath, &beams_amp, &pixels_ss, beamflag, bath, amp, bathacrosstrack, bathalongtrack, ss, ssacrosstrack, ssalongtrack, comment, &error); /* print debug statements */ if (verbose >= 2) { fprintf(stderr, "\ndbg2 Ping read in program <%s>\n", program_name); fprintf(stderr, "dbg2 kind: %d\n", kind); fprintf(stderr, "dbg2 error: %d\n", error); fprintf(stderr, "dbg2 status: %d\n", status); } /* deal with nav and time from survey data only - not nav, sidescan, or subbottom */ if (( error <= MB_ERROR_NO_ERROR) && ( kind == MB_DATA_DATA) ) { /* flag positions and times for output at specified interval */ if (( nread == 0) || ( time_d - savetime_d >= interval) ) { savetime_d = time_d; output = MB_YES; } lasttime_d = time_d; lastlon = navlon; lastlat = navlat; /* increment counter */ nread++; } /* output position and time if flagged or end of file */ if (( output == MB_YES) || ( error == MB_ERROR_EOF) ) { if (lastlon < 0.0) lastlon += 360.0; mb_get_date(verbose, lasttime_d, time_i); fprintf(tfp, "%.6f %.6f %4.4d %2.2d %2.2d %2.2d %2.2d %2.2d\n", lastlat, lastlon, time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5]); } } /* close the swath file */ status = mb_close(verbose, &mbio_ptr, &error); /* output read statistics */ fprintf(stderr, "%d records read from %s\n", nread, file); /* close the llt file */ fclose(tfp); /* call predict_tide with popen */ sprintf(predict_tide, "%s/predict_tide", otps_location_use); if ((tfp = popen(predict_tide, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open predict_time program using popen()\n"); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* send relevant input to predict_tide through its stdin stream */ fprintf(tfp, "%s/DATA/Model_%s\n", otps_location_use, otps_model); fprintf(tfp, "%s\n", lltfile); fprintf(tfp, "z\n\nAP\noce\n1\n"); /*fprintf(tfp, "z\nm2,s2,n2,k2,k1,o1,p1,q1\nAP\noce\n1\n");*/ fprintf(tfp, "%s\n", otpsfile); /* close the process */ pclose(tfp); /* now read results from predict_tide and rewrite them in a useful form */ if ((tfp = fopen(otpsfile, "r")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open predict_time results temporary file <%s>\n", otpsfile); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } if ((ofp = fopen(tide_file, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr, "\nUnable to open tide output file <%s>\n", tide_file); fprintf(stderr, "\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } fprintf(ofp, "# Tide model generated by program %s\n", program_name); fprintf(ofp, "# MB-System Version: %s\n", MB_VERSION); fprintf(ofp, "# Tide model generated by program %s\n", program_name); fprintf(ofp, "# which in turn calls OTPS program predict_tide obtained from:\n"); fprintf(ofp, "# http://www.coas.oregonstate.edu/research/po/research/tide/\n"); right_now = time((time_t *)0); strcpy(date, ctime(&right_now)); date[strlen(date) - 1] = '\0'; if ((user_ptr = getenv("USER")) == NULL) user_ptr = getenv("LOGNAME"); if (user_ptr != NULL) strcpy(user, user_ptr); else strcpy(user, "unknown"); gethostname(host, MBP_FILENAMESIZE); fprintf(ofp, "# Run by user <%s> on cpu <%s> at <%s>\n", user, host, date); /* loop over tide model values, writing them out in the specified format */ nline = 0; ngood = 0; while ((result = fgets(line, MB_PATH_MAXLINE, tfp)) == line) { nline++; if (( nline == 2) || ( nline == 3) ) { fprintf(ofp, "#%s", line); } else if (nline > 6) { nget = sscanf(line, "%lf %lf %d.%d.%d %d:%d:%d %lf %lf", &lat, &lon, &time_i[1], &time_i[2], &time_i[0], &time_i[3], &time_i[4], &time_i[5], &tide, &depth); if (nget == 10) { ngood++; /* if tide station data have been loaded, interpolate the * correction value to apply to the tide model */ if (mbotps_mode & MBOTPS_MODE_TIDESTATION && (ntidestation > 0)) { intstat = mb_linear_interp(verbose, tidestation_time_d - 1, tidestation_correction - 1, ntidestation, time_d, &correction, &itime, &error); if (intstat == MB_SUCCESS) tide += correction; // fprintf(stderr,"TIDE STATION CORRECTION: intstat:%d itime:%dof%d time_d:%f correction:%f tide:%f\n", // intstat, itime, ntidestation, time_d, correction, tide); } /* write out the tide model */ if (tideformat == 2) { fprintf(ofp, "%4.4d %2.2d %2.2d %2.2d %2.2d %2.2d %9.4f\n", time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5], tide); } else { mb_get_time(verbose, time_i, &time_d); fprintf(ofp, "%.3f %9.4f\n", time_d, tide); } } } } fclose(tfp); fclose(ofp); /* remove the temporary files */ unlink(lltfile); unlink(otpsfile); /* some helpful output */ fprintf(stderr, "\nResults are really in %s\n", tide_file); /* set mbprocess usage of tide file */ if (( mbprocess_update == MB_YES) && ( ngood > 0) ) { status = mb_pr_update_tide(verbose, swath_file, MBP_TIDE_ON, tide_file, tideformat, &error); fprintf(stderr, "MBprocess set to apply tide correction to %s\n", swath_file); } } /* figure out whether and what to read next */ if (read_datalist == MB_YES) { if ((status = mb_datalist_read(verbose, datalist, file, dfile, &format, &file_weight, &error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } else { read_data = MB_NO; } /* end loop over files in list */ } if (read_datalist == MB_YES) mb_datalist_close(verbose, &datalist, &error); } /* check memory */ if (verbose >= 4) status = mb_memory_list(verbose, &error); /* print output debug statements */ if (verbose >= 2) { fprintf(stderr, "\ndbg2 Program <%s> completed\n", program_name); fprintf(stderr, "dbg2 Ending status:\n"); fprintf(stderr, "dbg2 status: %d\n", status); } /* end it all */ exit(error); } /* main */
int main (int argc, char **argv) { /* id variables */ char program_name[] = "HSDUMP"; char help_message[] = "HSDUMP lists the information contained in data records on\n\tHydrosweep DS data files, including survey, calibrate, water \n\tvelocity and comment records. The default input stream is stdin."; char usage_message[] = "hsdump [-Fformat -V -H -Iinfile -Okind]"; /* parsing variables */ extern char *optarg; int errflg = 0; int c; int help = 0; int flag = 0; /* MBIO status variables */ int status = MB_SUCCESS; int verbose = 0; int error = MB_ERROR_NO_ERROR; char format_description[MB_DESCRIPTION_LENGTH]; char *message = NULL; /* MBIO read and write control parameters */ int format = 0; int pings; int lonflip; double bounds[4]; int btime_i[7]; int etime_i[7]; double btime_d; double etime_d; double speedmin; double timegap; int beams_bath; int beams_amp; int pixels_ss; char file[MB_PATH_MAXLINE]; void *mbio_ptr = NULL; /* mbio read and write values */ void *store_ptr; struct mbsys_hsds_struct *store; int kind; int time_i[7]; double time_d; double navlon; double navlat; double speed; double heading; double distance; double altitude; double sonardepth; int nbath; int namp; int nss; char *beamflag = NULL; double *bath = NULL; double *bathacrosstrack = NULL; double *bathalongtrack = NULL; double *amp = NULL; double *ss = NULL; double *ssacrosstrack = NULL; double *ssalongtrack = NULL; char comment[MB_COMMENT_MAXLINE]; /* dump control parameters */ int mb_data_data_list = MB_NO; int mb_data_comment_list = MB_NO; int mb_data_calibrate_list = MB_NO; int mb_data_mean_velocity_list = MB_NO; int mb_data_velocity_profile_list = MB_NO; int mb_data_standby_list = MB_NO; int mb_data_nav_source_list = MB_NO; int mb_data_data_count = 0; int mb_data_comment_count = 0; int mb_data_calibrate_count = 0; int mb_data_mean_velocity_count = 0; int mb_data_velocity_profile_count = 0; int mb_data_standby_count = 0; int mb_data_nav_source_count = 0; /* output stream for basic stuff (stdout if verbose <= 1, stderr if verbose > 1) */ FILE *output; int i; /* get current default values */ status = mb_defaults(verbose,&format,&pings,&lonflip,bounds, btime_i,etime_i,&speedmin,&timegap); /* reset all defaults */ format = MBF_HSATLRAW; pings = 1; lonflip = 0; bounds[0] = -360.; bounds[1] = 360.; bounds[2] = -90.; bounds[3] = 90.; btime_i[0] = 1962; btime_i[1] = 2; btime_i[2] = 21; btime_i[3] = 10; btime_i[4] = 30; btime_i[5] = 0; btime_i[6] = 0; etime_i[0] = 2062; etime_i[1] = 2; etime_i[2] = 21; etime_i[3] = 10; etime_i[4] = 30; etime_i[5] = 0; etime_i[6] = 0; speedmin = 0.0; timegap = 1000000000.0; /* set default input and output */ strcpy (file, "stdin"); /* process argument list */ while ((c = getopt(argc, argv, "VvHhF:f:I:i:O:o:")) != -1) switch (c) { case 'H': case 'h': help++; break; case 'V': case 'v': verbose++; break; case 'F': case 'f': sscanf (optarg,"%d", &format); flag++; break; case 'I': case 'i': sscanf (optarg,"%s", file); flag++; break; case 'O': case 'o': sscanf (optarg,"%d", &kind); if (kind == MB_DATA_DATA) mb_data_data_list = MB_YES; if (kind == MB_DATA_COMMENT) mb_data_comment_list = MB_YES; if (kind == MB_DATA_CALIBRATE) mb_data_calibrate_list = MB_YES; if (kind == MB_DATA_MEAN_VELOCITY) mb_data_mean_velocity_list = MB_YES; if (kind == MB_DATA_VELOCITY_PROFILE) mb_data_velocity_profile_list = MB_YES; if (kind == MB_DATA_STANDBY) mb_data_standby_list = MB_YES; if (kind == MB_DATA_NAV_SOURCE) mb_data_nav_source_list = MB_YES; flag++; break; case '?': errflg++; } /* set output stream */ if (verbose <= 1) output = stdout; else output = stderr; /* if error flagged then print it and exit */ if (errflg) { fprintf(output,"usage: %s\n", usage_message); fprintf(output,"\nProgram <%s> Terminated\n", program_name); error = MB_ERROR_BAD_USAGE; exit(error); } /* print starting message */ if (verbose == 1 || help) { fprintf(output,"\nProgram %s\n",program_name); fprintf(output,"MB-system Version %s\n",MB_VERSION); } /* print starting debug statements */ if (verbose >= 2) { fprintf(output,"\ndbg2 Program <%s>\n",program_name); fprintf(output,"dbg2 MB-system Version %s\n",MB_VERSION); fprintf(output,"dbg2 Control Parameters:\n"); fprintf(output,"dbg2 verbose: %d\n",verbose); fprintf(output,"dbg2 help: %d\n",help); fprintf(output,"dbg2 format: %d\n",format); fprintf(output,"dbg2 pings: %d\n",pings); fprintf(output,"dbg2 lonflip: %d\n",lonflip); fprintf(output,"dbg2 bounds[0]: %f\n",bounds[0]); fprintf(output,"dbg2 bounds[1]: %f\n",bounds[1]); fprintf(output,"dbg2 bounds[2]: %f\n",bounds[2]); fprintf(output,"dbg2 bounds[3]: %f\n",bounds[3]); fprintf(output,"dbg2 btime_i[0]: %d\n",btime_i[0]); fprintf(output,"dbg2 btime_i[1]: %d\n",btime_i[1]); fprintf(output,"dbg2 btime_i[2]: %d\n",btime_i[2]); fprintf(output,"dbg2 btime_i[3]: %d\n",btime_i[3]); fprintf(output,"dbg2 btime_i[4]: %d\n",btime_i[4]); fprintf(output,"dbg2 btime_i[5]: %d\n",btime_i[5]); fprintf(output,"dbg2 btime_i[6]: %d\n",btime_i[6]); fprintf(output,"dbg2 etime_i[0]: %d\n",etime_i[0]); fprintf(output,"dbg2 etime_i[1]: %d\n",etime_i[1]); fprintf(output,"dbg2 etime_i[2]: %d\n",etime_i[2]); fprintf(output,"dbg2 etime_i[3]: %d\n",etime_i[3]); fprintf(output,"dbg2 etime_i[4]: %d\n",etime_i[4]); fprintf(output,"dbg2 etime_i[5]: %d\n",etime_i[5]); fprintf(output,"dbg2 etime_i[6]: %d\n",etime_i[6]); fprintf(output,"dbg2 speedmin: %f\n",speedmin); fprintf(output,"dbg2 timegap: %f\n",timegap); fprintf(output,"dbg2 input file: %s\n",file); fprintf(output,"dbg2 mb_data_data_list: %d\n", mb_data_data_list); fprintf(output,"dbg2 mb_data_comment_list: %d\n", mb_data_comment_list); fprintf(output,"dbg2 mb_data_calibrate_list: %d\n", mb_data_calibrate_list); fprintf(output,"dbg2 mb_data_mean_velocity_list: %d\n", mb_data_mean_velocity_list); fprintf(output,"dbg2 mb_data_velocity_profile_list: %d\n", mb_data_velocity_profile_list); fprintf(output,"dbg2 mb_data_standby_list: %d\n", mb_data_standby_list); fprintf(output,"dbg2 mb_data_nav_source_list: %d\n", mb_data_nav_source_list); } /* if help desired then print it and exit */ if (help) { fprintf(output,"\n%s\n",help_message); fprintf(output,"\nusage: %s\n", usage_message); exit(error); } /* if bad format specified then print it and exit */ status = mb_format(verbose,&format,&error); if (format != MBF_HSATLRAW && format != MBF_HSLDEOIH) { fprintf(output,"\nProgram <%s> requires complete Hydrosweep DS data stream\n",program_name); fprintf(output,"!!Format %d is unacceptable, only formats %d and %d can be used\n",format,MBF_HSATLRAW,MBF_HSLDEOIH); fprintf(output,"\nProgram <%s> Terminated\n", program_name); error = MB_ERROR_BAD_FORMAT; exit(error); } /* initialize reading the input multibeam file */ if ((status = mb_read_init( verbose,file,format,pings,lonflip,bounds, btime_i,etime_i,speedmin,timegap, &mbio_ptr,&btime_d,&etime_d, &beams_bath,&beams_amp,&pixels_ss,&error)) != MB_SUCCESS) { mb_error(verbose,error,&message); fprintf(output,"\nMBIO Error returned from function <mb_read_init>:\n%s\n",message); fprintf(output,"\nMultibeam File <%s> not initialized for reading\n",file); fprintf(output,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* allocate memory for data arrays */ status = mb_mallocd(verbose,__FILE__,__LINE__,beams_bath*sizeof(char),(void **)&beamflag,&error); status = mb_mallocd(verbose,__FILE__,__LINE__,beams_bath*sizeof(double),(void **)&bath,&error); status = mb_mallocd(verbose,__FILE__,__LINE__,beams_bath*sizeof(double), (void **)&bathacrosstrack,&error); status = mb_mallocd(verbose,__FILE__,__LINE__,beams_bath*sizeof(double), (void **)&bathalongtrack,&error); status = mb_mallocd(verbose,__FILE__,__LINE__,beams_amp*sizeof(double),(void **)&,&error); status = mb_mallocd(verbose,__FILE__,__LINE__,pixels_ss*sizeof(double),(void **)&ss,&error); status = mb_mallocd(verbose,__FILE__,__LINE__,pixels_ss*sizeof(double), (void **)&ssacrosstrack,&error); status = mb_mallocd(verbose,__FILE__,__LINE__,pixels_ss*sizeof(double), (void **)&ssalongtrack,&error); /* if error initializing memory then quit */ if (error != MB_ERROR_NO_ERROR) { mb_error(verbose,error,&message); fprintf(output,"\nMBIO Error allocating data arrays:\n%s\n",message); fprintf(output,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* printf out file and format */ mb_format_description(verbose, &format, format_description, &error); fprintf(output,"\nHydrosweep DS Data File: %s\n",file); fprintf(output,"MBIO Data Format ID: %d\n",format); fprintf(output,"%s",format_description); /* read and list */ while (error <= MB_ERROR_NO_ERROR) { /* read some data */ error = MB_ERROR_NO_ERROR; status = MB_SUCCESS; status = mb_get_all(verbose,mbio_ptr,&store_ptr,&kind, time_i,&time_d,&navlon,&navlat, &speed,&heading, &distance,&altitude,&sonardepth, &nbath,&namp,&nss, beamflag,bath,amp,bathacrosstrack,bathalongtrack, ss,ssacrosstrack,ssalongtrack, comment,&error); /* get data structure pointer */ store = (struct mbsys_hsds_struct *) store_ptr; /* non-survey data do not matter to hsdump */ if (error >= MB_ERROR_OTHER && error < MB_ERROR_NO_ERROR) { status = MB_SUCCESS; error = MB_ERROR_NO_ERROR; } /* output error messages */ if (verbose >= 1 && error <= MB_ERROR_OTHER) { mb_error(verbose,error,&message); fprintf(output,"\nNonfatal MBIO Error:\n%s\n",message); } else if (verbose >= 1 && error > MB_ERROR_NO_ERROR && error != MB_ERROR_EOF) { mb_error(verbose,error,&message); fprintf(output,"\nFatal MBIO Error:\n%s\n",message); } /* deal with survey data record */ if (kind == MB_DATA_DATA && mb_data_data_list == MB_YES) { mb_data_data_count++; fprintf(output,"\n"); fprintf(output,"Survey Data Record (ERGNMESS + ERGNSLZT +ERGNAMPL):\n"); fprintf(output," Time: %2d/%2d/%4d %2.2d:%2.2d:%2.2d\n", store->month,store->day,store->year, store->hour,store->minute,store->second); fprintf(output," Alternate Time: %4d %4d\n", store->alt_minute,store->alt_second); fprintf(output," Longitude: %f\n",store->lon); fprintf(output," Latitude: %f\n",store->lat); fprintf(output," Course: %f\n", store->course_true); fprintf(output," Course On Ground: %f\n", store->course_ground); fprintf(output," Speed: %f\n", store->speed); fprintf(output," Speed On Ground: %f\n", store->speed_ground); fprintf(output," Transverse Speed: %f\n", store->speed_transverse); fprintf(output," Speed Reference: %c%c\n", store->speed_reference[0], store->speed_reference[1]); fprintf(output," Roll: %f\n", store->roll); fprintf(output," Pitch: %f\n", store->pitch); fprintf(output," Heave: %f\n", store->heave); fprintf(output," Track: %d\n", store->track); fprintf(output," Center Depth: %f\n", store->depth_center); fprintf(output," Depth Scale: %f\n", store->depth_scale); fprintf(output," Spare: %d\n", store->spare); fprintf(output," Crosstrack Distances and Depths:\n"); for (i=0;i<MBSYS_HSDS_BEAMS;i++) fprintf(output," %5d %5d\n", store->distance[i],store->depth[i]); fprintf(output," Center Travel Time: %f\n", store->time_center); fprintf(output," Time Scale: %f\n", store->time_scale); fprintf(output," Travel Times:\n"); for (i=0;i<MBSYS_HSDS_BEAMS;i++) fprintf(output," %5d\n", store->time[i]); fprintf(output," Gyro Headings:\n"); for (i=0;i<11;i++) fprintf(output," %f\n", store->gyro[i]); fprintf(output," Mode: %c%c\n", store->mode[0],store->mode[1]); fprintf(output," Transmit Starboard: %d\n", store->trans_strbd); fprintf(output," Transmit Vertical: %d\n", store->trans_vert); fprintf(output," Transmit Port: %d\n", store->trans_port); fprintf(output," Pulse Starboard: %d\n", store->pulse_len_strbd); fprintf(output," Pulse Vertical: %d\n", store->pulse_len_vert); fprintf(output," Pulse Port: %d\n", store->pulse_len_port); fprintf(output," Gain Start: %d\n", store->gain_start); fprintf(output," Compensation Factor:%d\n", store->r_compensation_factor); fprintf(output," Compensation Start: %d\n", store->compensation_start); fprintf(output," Increase Start: %d\n", store->increase_start); fprintf(output," Near TVC: %d\n", store->tvc_near); fprintf(output," Far TVC: %d\n", store->tvc_far); fprintf(output," Near Increase: %d\n", store->increase_int_near); fprintf(output," Far Increase: %d\n", store->increase_int_far); fprintf(output," Center Gain: %d\n", store->gain_center); fprintf(output," Filter Gain: %f\n", store->filter_gain); fprintf(output," Center Amplitude: %d\n", store->amplitude_center); fprintf(output," Center Echo Time: %d\n", store->echo_duration_center); fprintf(output," Echo Scale: %d\n", store->echo_scale_center); fprintf(output," Amplitudes and Durations:\n"); for (i=0;i<MBSYS_HSDS_BEAMS;i++) fprintf(output," %5d %5d\n", store->amplitude[i], store->echo_duration[i]); fprintf(output," Echo Gains and Scales:\n"); for (i=0;i<16;i++) fprintf(output," %5d %5d\n", store->gain[i], store->echo_scale[i]); } /* deal with comment record */ if (kind == MB_DATA_COMMENT && mb_data_comment_list == MB_YES) { mb_data_comment_count++; fprintf(output,"\n"); fprintf(output,"Comment Record (LDEOCMNT):\n"); fprintf(output," %s\n",store->comment); } /* deal with calibrate data record */ if (kind == MB_DATA_CALIBRATE && mb_data_calibrate_list == MB_YES) { mb_data_calibrate_count++; fprintf(output,"\n"); fprintf(output,"Calibrate Data Record (ERGNEICH + ERGNSLZT +ERGNAMPL):\n"); fprintf(output," Time: %2d/%2d/%4d %2.2d:%2.2d:%2.2d\n", store->month,store->day,store->year, store->hour,store->minute,store->second); fprintf(output," Alternate Time: %4d %4d\n", store->alt_minute,store->alt_second); fprintf(output," Longitude: %f\n",store->lon); fprintf(output," Latitude: %f\n",store->lat); fprintf(output," Course: %f\n", store->course_true); fprintf(output," Course On Ground: %f\n", store->course_ground); fprintf(output," Speed: %f\n", store->speed); fprintf(output," Speed On Ground: %f\n", store->speed_ground); fprintf(output," Transverse Speed: %f\n", store->speed_transverse); fprintf(output," Speed Reference: %c%c\n", store->speed_reference[0], store->speed_reference[1]); fprintf(output," Roll: %f\n", store->roll); fprintf(output," Pitch: %f\n", store->pitch); fprintf(output," Heave: %f\n", store->heave); fprintf(output," Track: %d\n", store->track); fprintf(output," Center Depth: %f\n", store->depth_center); fprintf(output," Depth Scale: %f\n", store->depth_scale); fprintf(output," Spare: %d\n", store->spare); fprintf(output," Crosstrack Distances and Depths:\n"); for (i=0;i<MBSYS_HSDS_BEAMS;i++) fprintf(output," %5d %5d\n", store->distance[i],store->depth[i]); fprintf(output," Center Travel Time: %f\n", store->time_center); fprintf(output," Time Scale: %f\n", store->time_scale); fprintf(output," Travel Times:\n"); for (i=0;i<MBSYS_HSDS_BEAMS;i++) fprintf(output," %5d\n", store->time[i]); fprintf(output," Gyro Headings:\n"); for (i=0;i<11;i++) fprintf(output," %f\n", store->gyro[i]); fprintf(output," Mode: %c%c\n", store->mode[0],store->mode[1]); fprintf(output," Transmit Starboard: %d\n", store->trans_strbd); fprintf(output," Transmit Vertical: %d\n", store->trans_vert); fprintf(output," Transmit Port: %d\n", store->trans_port); fprintf(output," Pulse Starboard: %d\n", store->pulse_len_strbd); fprintf(output," Pulse Vertical: %d\n", store->pulse_len_vert); fprintf(output," Pulse Port: %d\n", store->pulse_len_port); fprintf(output," Gain Start: %d\n", store->gain_start); fprintf(output," Compensation Factor:%d\n", store->r_compensation_factor); fprintf(output," Compensation Start: %d\n", store->compensation_start); fprintf(output," Increase Start: %d\n", store->increase_start); fprintf(output," Near TVC: %d\n", store->tvc_near); fprintf(output," Far TVC: %d\n", store->tvc_far); fprintf(output," Near Increase: %d\n", store->increase_int_near); fprintf(output," Far Increase: %d\n", store->increase_int_far); fprintf(output," Center Gain: %d\n", store->gain_center); fprintf(output," Filter Gain: %f\n", store->filter_gain); fprintf(output," Center Amplitude: %d\n", store->amplitude_center); fprintf(output," Center Echo Time: %d\n", store->echo_duration_center); fprintf(output," Echo Scale: %d\n", store->echo_scale_center); fprintf(output," Amplitudes and Durations:\n"); for (i=0;i<MBSYS_HSDS_BEAMS;i++) fprintf(output," %5d %5d\n", store->amplitude[i], store->echo_duration[i]); fprintf(output," Echo Gains and Scales:\n"); for (i=0;i<16;i++) fprintf(output," %5d %5d\n", store->gain[i], store->echo_scale[i]); } /* deal with mean velocity data record */ if (kind == MB_DATA_MEAN_VELOCITY && mb_data_mean_velocity_list == MB_YES) { mb_data_mean_velocity_count++; fprintf(output,"\n"); fprintf(output,"Mean Water Velocity Record (ERGNHYDI):\n"); fprintf(output," Time: %2d/%2d/%4d %2.2d:%2.2d:%2.2d\n", store->month,store->day,store->year, store->hour,store->minute,store->second); fprintf(output," Alternate Time: %4d %4d\n", store->alt_minute,store->alt_second); fprintf(output," Longitude: %f\n",store->lon); fprintf(output," Latitude: %f\n",store->lat); fprintf(output," Draught: %f\n", store->draught); fprintf(output," Mean velocity: %f\n", store->vel_mean); fprintf(output," Keel velocity: %f\n", store->vel_keel); fprintf(output," Tide: %f\n",store->tide); } /* deal with velocity profile data record */ if (kind == MB_DATA_VELOCITY_PROFILE && mb_data_velocity_profile_list == MB_YES) { mb_data_velocity_profile_count++; fprintf(output,"\n"); fprintf(output,"Water Velocity Profile Record (ERGNCTDS):\n"); fprintf(output," Time: %2d/%2d/%4d %2.2d:%2.2d:%2.2d\n", store->month,store->day,store->year, store->hour,store->minute,store->second); fprintf(output," Longitude: %f\n",store->lon); fprintf(output," Latitude: %f\n",store->lat); fprintf(output," Number of points: %d\n", store->num_vel); fprintf(output," Water Velocity Profile:\n"); for (i=0;i<store->num_vel;i++) fprintf(output," %f %f\n", store->vdepth[i],store->velocity[i]); } /* deal with standby data record */ if (kind == MB_DATA_STANDBY && mb_data_standby_list == MB_YES) { mb_data_standby_count++; fprintf(output,"\n"); fprintf(output,"Standby Data Record (ERGNPARA):\n"); fprintf(output," Time: %2d/%2d/%4d %2.2d:%2.2d:%2.2d\n", store->month,store->day,store->year, store->hour,store->minute,store->second); fprintf(output," Alternate Time: %4d %4d\n", store->alt_minute,store->alt_second); fprintf(output," Longitude: %f\n",store->lon); fprintf(output," Latitude: %f\n",store->lat); } /* deal with navigation source data record */ if (kind == MB_DATA_NAV_SOURCE && mb_data_nav_source_list == MB_YES) { mb_data_nav_source_count++; fprintf(output,"\n"); fprintf(output,"Standby Data Record (ERGNPARA):\n"); fprintf(output," Time: %2d/%2d/%4d %2.2d:%2.2d:%2.2d\n", store->month,store->day,store->year, store->hour,store->minute,store->second); fprintf(output," Alternate Time: %4d %4d\n", store->alt_minute,store->alt_second); fprintf(output," Longitude: %f\n",store->lon); fprintf(output," Latitude: %f\n",store->lat); fprintf(output," X Correction: %f\n", store->pos_corr_x); fprintf(output," Y Correction: %f\n", store->pos_corr_y); fprintf(output," Sensors: "); for (i=0;i<10;i++) fprintf(output,"%c",store->sensors[i]); fprintf(output,"\n"); } } /* close the file */ status = mb_close(verbose,&mbio_ptr,&error); /* deallocate memory for data arrays */ mb_freed(verbose,__FILE__,__LINE__,(void **)&beamflag,&error); mb_freed(verbose,__FILE__,__LINE__,(void **)&bath,&error); mb_freed(verbose,__FILE__,__LINE__,(void **)&bathacrosstrack,&error); mb_freed(verbose,__FILE__,__LINE__,(void **)&bathalongtrack,&error); mb_freed(verbose,__FILE__,__LINE__,(void **)&,&error); mb_freed(verbose,__FILE__,__LINE__,(void **)&ss,&error); mb_freed(verbose,__FILE__,__LINE__,(void **)&ssacrosstrack,&error); mb_freed(verbose,__FILE__,__LINE__,(void **)&ssalongtrack,&error); /* check memory */ if (verbose >= 4) status = mb_memory_list(verbose,&error); /* give the statistics */ fprintf(output,"\n"); if (mb_data_data_list == MB_YES) fprintf(output,"%d survey data records listed\n", mb_data_data_count); if (mb_data_comment_list == MB_YES) fprintf(output,"%d comment records listed\n", mb_data_comment_count); if (mb_data_calibrate_list == MB_YES) fprintf(output,"%d calibrate data records listed\n", mb_data_calibrate_count); if (mb_data_mean_velocity_list == MB_YES) fprintf(output,"%d mean velocity data records listed\n", mb_data_mean_velocity_count); if (mb_data_velocity_profile_list == MB_YES) fprintf(output,"%d velocity profile data records listed\n", mb_data_velocity_profile_count); if (mb_data_standby_list == MB_YES) fprintf(output,"%d standby data records listed\n", mb_data_standby_count); if (mb_data_nav_source_list == MB_YES) fprintf(output,"%d navigation source data records listed\n", mb_data_nav_source_count); /* end it all */ exit(error); }
int main (int argc, char **argv) { static char rcs_id[] = "$Id$"; static char program_name[] = "mbotps"; static char help_message[] = "MBotps predicts tides using methods and data derived from the OSU Tidal Prediction Software (OTPS) distributions."; static char usage_message[] = "mbotps [-Atideformat -Byear/month/day/hour/minute/second -Dinterval\n\t-Eyear/month/day/hour/minute/second -Fformat\n" "\t-Idatalist.mb-1 -Lopts_path -Ooutput -Potps_location -Rlon/lat -Tmodel -V]"; extern char *optarg; int errflg = 0; int c; int help = 0; int flag = 0; /* MBIO status variables */ int status = MB_SUCCESS; int verbose = 0; int error = MB_ERROR_NO_ERROR; char *message; /* MBIO read control parameters */ int read_datalist = MB_NO; mb_path read_file; void *datalist; int look_processed = MB_DATALIST_LOOK_UNSET; double file_weight; mb_path swath_file; mb_path file; int format; int pings; int lonflip; double bounds[4]; double speedmin; double timegap; int beams_bath; int beams_amp; int pixels_ss; /* MBIO read values */ void *mbio_ptr = NULL; void *store_ptr = NULL; int kind; int time_i[7]; double time_d; double navlon; double navlat; double speed; double heading; double distance; double altitude; double sonardepth; char *beamflag = NULL; double *bath = NULL; double *bathacrosstrack = NULL; double *bathalongtrack = NULL; double *amp = NULL; double *ss = NULL; double *ssacrosstrack = NULL; double *ssalongtrack = NULL; char comment[MB_COMMENT_MAXLINE]; /* mbotps control parameters */ mb_path otps_location_use; int notpsmodels = 0; int nmodeldatafiles = 0; int mbotps_mode = MBOTPS_MODE_POSITION; double tidelon; double tidelat; double btime_d; double etime_d; int btime_i[7]; int etime_i[7]; double interval = 300.0; mb_path tidefile; int mbprocess_update = MB_NO; int tideformat = 2; int ngood; /* time parameters */ time_t right_now; char date[32], user[MB_PATH_MAXLINE], *user_ptr, host[MB_PATH_MAXLINE]; int pid; FILE *tfp, *mfp, *ofp; struct stat file_status; int fstat; mb_path lltfile; mb_path otpsfile; mb_path line; mb_path predict_tide; int otps_model_set = MB_NO; mb_path otps_model; mb_path modelname; mb_path modelfile; mb_path modeldatafile; int read_data; int ntime; int nread; int nline; int nget; int output; double savetime_d; double lasttime_d; double lastlon; double lastlat; double lon; double lat; double tide; double depth; char *result; int i; /* get current default values */ status = mb_defaults(verbose,&format,&pings,&lonflip,bounds, btime_i,etime_i,&speedmin,&timegap); /* set default input to datalist.mb-1 */ strcpy (read_file, "datalist.mb-1"); /* set default location of the OTPS package */ strcpy(otps_location_use, otps_location); /* set defaults for the AUV survey we were running on Coaxial Segment, Juan de Fuca Ridge while I wrote this code */ sprintf(otps_model, "tpxo7.2"); sprintf(tidefile, "tide_model.txt"); tidelon = -129.588618; tidelat = 46.50459; interval = 60.0; btime_i[0] = 2009; btime_i[1] = 7; btime_i[2] = 31; btime_i[3] = 0; btime_i[4] = 0; btime_i[5] = 0; btime_i[6] = 0; etime_i[0] = 2009; etime_i[1] = 8; etime_i[2] = 2; etime_i[3] = 1; etime_i[4] = 0; etime_i[5] = 0; etime_i[6] = 0; /* process argument list */ while ((c = getopt(argc, argv, "A:a:B:b:D:d:E:e:F:f:I:i:MmO:o:P:p:R:r:T:t:VvHh")) != -1) switch (c) { case 'H': case 'h': help++; break; case 'V': case 'v': verbose++; break; case 'A': case 'a': sscanf (optarg,"%d", &tideformat); if (tideformat != 2) tideformat = 1; break; case 'B': case 'b': sscanf (optarg,"%d/%d/%d/%d/%d/%d", &btime_i[0],&btime_i[1],&btime_i[2], &btime_i[3],&btime_i[4],&btime_i[5]); btime_i[6] = 0; flag++; break; case 'D': case 'd': sscanf (optarg,"%lf", &interval); break; case 'E': case 'e': sscanf (optarg,"%d/%d/%d/%d/%d/%d", &etime_i[0],&etime_i[1],&etime_i[2], &etime_i[3],&etime_i[4],&etime_i[5]); etime_i[6] = 0; flag++; break; case 'F': case 'f': sscanf (optarg,"%d", &format); flag++; break; case 'I': case 'i': sscanf (optarg,"%s", read_file); mbotps_mode = MBOTPS_MODE_NAVIGATION; flag++; break; case 'M': case 'm': mbprocess_update = MB_YES; break; case 'O': case 'o': sscanf (optarg,"%s", tidefile); break; case 'P': case 'p': sscanf (optarg,"%s", otps_location_use); break; case 'R': case 'r': sscanf (optarg,"%lf/%lf", &tidelon, &tidelat); break; case 'T': case 't': sscanf (optarg,"%s", otps_model); otps_model_set = MB_YES; break; case '?': errflg++; } /* if error flagged then print it and exit */ if (errflg) { fprintf(stderr,"usage: %s\n", usage_message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); error = MB_ERROR_BAD_USAGE; exit(error); } /* print starting message */ if (verbose == 1 || help) { fprintf(stderr,"\nProgram %s\n",program_name); fprintf(stderr,"Version %s\n",rcs_id); fprintf(stderr,"MB-system Version %s\n",MB_VERSION); } /* if help desired then print it and exit */ if (help) { fprintf(stderr,"\n%s\n",help_message); fprintf(stderr,"\nusage: %s\n", usage_message); } /* Check for available tide models */ if (help || verbose > 0) { fprintf(stderr,"\nChecking for available OTPS tide models\n"); fprintf(stderr,"OTPS location: %s\nValid OTPS tidal models:\n", otps_location_use); } notpsmodels = 0; sprintf(line, "/bin/ls -1 %s/DATA | grep Model_ | sed \"s/^Model_//\"", otps_location_use); if ((tfp = popen(line, "r")) != NULL) { /* send relevant input to predict_tide through its stdin stream */ while (fgets(line, sizeof(line), tfp)) { sscanf(line, "%s", modelname); sprintf(modelfile, "%s/DATA/Model_%s", otps_location_use, modelname); nmodeldatafiles = 0; /* check the files referenced in the model file */ if ((mfp = fopen(modelfile, "r")) != NULL) { /* stat the file referenced in each line */ while (fgets(modeldatafile, MB_PATH_MAXLINE, mfp) != NULL) { if (strlen(modeldatafile) > 0) modeldatafile[strlen(modeldatafile)-1] = '\0'; if ((fstat = stat(modeldatafile, &file_status)) == 0 && (file_status.st_mode & S_IFMT) != S_IFDIR) { nmodeldatafiles++; } } fclose(mfp); } if (nmodeldatafiles >= 3) { if (help || verbose > 0) fprintf(stderr," %s\n", modelname); if (otps_model_set == MB_NO) { if (notpsmodels == 0 || strcmp(modelname, "tpxo7.2") == 0) strcpy(otps_model, modelname); } notpsmodels++; } } /* close the process */ pclose(tfp); } else { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open ls using popen()\n"); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } if (help || verbose > 0) { fprintf(stderr,"Number of available OTPS tide models: %d\n", notpsmodels); fprintf(stderr,"\nUsing OTPS tide model: %s\n", otps_model); } /* print starting debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Program <%s>\n",program_name); fprintf(stderr,"dbg2 Version %s\n",rcs_id); fprintf(stderr,"dbg2 MB-system Version %s\n",MB_VERSION); fprintf(stderr,"dbg2 Control Parameters:\n"); fprintf(stderr,"dbg2 verbose: %d\n",verbose); fprintf(stderr,"dbg2 help: %d\n",help); fprintf(stderr,"dbg2 otps_location: %s\n",otps_location); fprintf(stderr,"dbg2 otps_location_use:%s\n",otps_location_use); fprintf(stderr,"dbg2 otps_model_set: %d\n",otps_model_set); fprintf(stderr,"dbg2 otps_model: %s\n",otps_model); fprintf(stderr,"dbg2 mbotps_mode: %d\n",mbotps_mode); fprintf(stderr,"dbg2 tidelon: %f\n",tidelon); fprintf(stderr,"dbg2 tidelat: %f\n",tidelat); fprintf(stderr,"dbg2 btime_i[0]: %d\n",btime_i[0]); fprintf(stderr,"dbg2 btime_i[1]: %d\n",btime_i[1]); fprintf(stderr,"dbg2 btime_i[2]: %d\n",btime_i[2]); fprintf(stderr,"dbg2 btime_i[3]: %d\n",btime_i[3]); fprintf(stderr,"dbg2 btime_i[4]: %d\n",btime_i[4]); fprintf(stderr,"dbg2 btime_i[5]: %d\n",btime_i[5]); fprintf(stderr,"dbg2 btime_i[6]: %d\n",btime_i[6]); fprintf(stderr,"dbg2 etime_i[0]: %d\n",etime_i[0]); fprintf(stderr,"dbg2 etime_i[1]: %d\n",etime_i[1]); fprintf(stderr,"dbg2 etime_i[2]: %d\n",etime_i[2]); fprintf(stderr,"dbg2 etime_i[3]: %d\n",etime_i[3]); fprintf(stderr,"dbg2 etime_i[4]: %d\n",etime_i[4]); fprintf(stderr,"dbg2 etime_i[5]: %d\n",etime_i[5]); fprintf(stderr,"dbg2 etime_i[6]: %d\n",etime_i[6]); fprintf(stderr,"dbg2 interval: %f\n",interval); fprintf(stderr,"dbg2 tidefile: %s\n",tidefile); fprintf(stderr,"dbg2 mbprocess_update: %d\n",mbprocess_update); fprintf(stderr,"dbg2 tideformat: %d\n",tideformat); fprintf(stderr,"dbg2 format: %d\n",format); fprintf(stderr,"dbg2 read_file: %s\n",read_file); } /* exit if no valid OTPS models can be found */ if (notpsmodels <= 0) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to find a valid OTPS tidal model\n"); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* if help was all that was desired then exit */ if (help) { exit(error); } /* get tides for a single position and time range */ if (mbotps_mode == MBOTPS_MODE_POSITION) { /* first open temporary file of lat lon time */ pid = getpid(); sprintf(lltfile, "tmp_mbotps_llt_%d.txt", pid); sprintf(otpsfile, "tmp_mbotps_llttd_%d.txt", pid); if ((tfp = fopen(lltfile,"w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open temporary lat-lon-time file <%s> for writing\n",lltfile); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* make sure longitude is positive */ if (tidelon < 0.0) tidelon += 360.0; /* loop over the time of interest generating the lat-lon-time values */ mb_get_time(verbose, btime_i, &btime_d); mb_get_time(verbose, etime_i, &etime_d); ntime = 1 + (int)floor((etime_d - btime_d) / interval); for (i=0;i<ntime;i++) { time_d = btime_d + i * interval; mb_get_date(verbose, time_d, time_i); fprintf(tfp, "%.6f %.6f %4.4d %2.2d %2.2d %2.2d %2.2d %2.2d\n", tidelat, tidelon, time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5]); } /* close the llt file */ fclose(tfp); /* call predict_tide with popen */ sprintf(predict_tide, "%s/predict_tide", otps_location_use); if ((tfp = popen(predict_tide, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open predict_time program using popen()\n"); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* send relevant input to predict_tide through its stdin stream */ fprintf(tfp, "%s/DATA/Model_%s\n", otps_location_use,otps_model); fprintf(tfp, "%s\n", lltfile); fprintf(tfp, "z\n\nAP\noce\n1\n"); /*fprintf(tfp, "z\nm2,s2,n2,k2,k1,o1,p1,q1\nAP\noce\n1\n");*/ fprintf(tfp, "%s\n", otpsfile); /* close the process */ pclose(tfp); /* now read results from predict_tide and rewrite them in a useful form */ if ((tfp = fopen(otpsfile, "r")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open predict_time results temporary file <%s>\n", otpsfile); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } if ((ofp = fopen(tidefile, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open tide output file <%s>\n", tidefile); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } fprintf(ofp, "# Tide model generated by program %s\n", program_name); fprintf(ofp, "# Version: %s\n", rcs_id); fprintf(ofp, "# MB-System Version: %s\n", MB_VERSION); fprintf(ofp, "# Tide model generated by program %s\n", program_name); fprintf(ofp, "# which in turn calls OTPS program predict_tide obtained from:\n"); fprintf(ofp, "# http://www.coas.oregonstate.edu/research/po/research/tide/\n"); fprintf(ofp, "#\n"); fprintf(ofp, "# OTPSnc tide model: \n"); fprintf(ofp, "# %s\n",otps_model); if (tideformat == 2) { fprintf(ofp, "# Output format:\n"); fprintf(ofp, "# year month day hour minute second tide\n"); fprintf(ofp, "# where tide is in meters\n"); } else { fprintf(ofp, "# Output format:\n"); fprintf(ofp, "# time_d tide\n"); fprintf(ofp, "# where time_d is in seconds since January 1, 1970\n"); fprintf(ofp, "# and tide is in meters\n"); } right_now = time((time_t *)0); strcpy(date,ctime(&right_now)); date[strlen(date)-1] = '\0'; if ((user_ptr = getenv("USER")) == NULL) user_ptr = getenv("LOGNAME"); if (user_ptr != NULL) strcpy(user,user_ptr); else strcpy(user, "unknown"); gethostname(host,MBP_FILENAMESIZE); fprintf(ofp,"# Run by user <%s> on cpu <%s> at <%s>\n", user,host,date); nline = 0; ngood = 0; while ((result = fgets(line,MB_PATH_MAXLINE,tfp)) == line) { nline++; if (nline == 2 || nline == 3) { fprintf(ofp, "#%s", line); } else if (nline > 6) { nget = sscanf(line,"%lf %lf %d.%d.%d %d:%d:%d %lf %lf", &lat, &lon, &time_i[1], &time_i[2], &time_i[0], &time_i[3], &time_i[4], &time_i[5], &tide, &depth); if (nget == 10) { ngood++; if (tideformat ==2) { fprintf(ofp, "%4.4d %2.2d %2.2d %2.2d %2.2d %2.2d %9.4f\n", time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5], tide); } else { mb_get_time(verbose,time_i,&time_d); fprintf(ofp, "%.3f %9.4f\n",time_d, tide); } } } } fclose(tfp); fclose(ofp); /* remove the temporary files */ unlink("lltfile"); unlink("otpsfile"); /* some helpful output */ fprintf(stderr, "\nResults are really in %s\n", tidefile); } /* end single position mode */ /* else get tides along the navigation contained in a set of swath files */ else if (mbotps_mode == MBOTPS_MODE_NAVIGATION) { /* get format if required */ if (format == 0) mb_get_format(verbose,read_file,NULL,&format,&error); /* determine whether to read one file or a list of files */ if (format < 0) read_datalist = MB_YES; /* open file list */ if (read_datalist == MB_YES) { if ((status = mb_datalist_open(verbose,&datalist, read_file,look_processed,&error)) != MB_SUCCESS) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open data list file: %s\n", read_file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } /* else copy single filename to be read */ else { strcpy(file, read_file); read_data = MB_YES; } /* loop over all files to be read */ while (read_data == MB_YES) { /* some helpful output */ fprintf(stderr, "\n---------------------------------------\n\nProcessing tides for %s\n\n", file); /* first open temporary file of lat lon time */ pid = getpid(); strcpy(swath_file, file); sprintf(lltfile, "tmp_mbotps_llt_%d.txt", pid); sprintf(otpsfile, "tmp_mbotps_llttd_%d.txt", pid); sprintf(tidefile, "%s.tde", file); if ((tfp = fopen(lltfile,"w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open temporary lat-lon-time file <%s> for writing\n",lltfile); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* read fnv file if possible */ mb_get_fnv(verbose, file, &format, &error); /* initialize reading the swath file */ if ((status = mb_read_init( verbose,file,format,pings,lonflip,bounds, btime_i,etime_i,speedmin,timegap, &mbio_ptr,&btime_d,&etime_d, &beams_bath,&beams_amp,&pixels_ss,&error)) != MB_SUCCESS) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error returned from function <mb_read_init>:\n%s\n",message); fprintf(stderr,"\nMultibeam File <%s> not initialized for reading\n",file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* allocate memory for data arrays */ if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(char), (void **)&beamflag, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bath, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_AMPLITUDE, sizeof(double), (void **)&, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathalongtrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ss, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssalongtrack, &error); /* if error initializing memory then quit */ if (error != MB_ERROR_NO_ERROR) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error allocating data arrays:\n%s\n", message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* read and use data */ nread = 0; while (error <= MB_ERROR_NO_ERROR) { /* reset error */ error = MB_ERROR_NO_ERROR; output = MB_NO; /* read next data record */ status = mb_get_all(verbose,mbio_ptr,&store_ptr,&kind, time_i,&time_d,&navlon,&navlat, &speed,&heading, &distance,&altitude,&sonardepth, &beams_bath,&beams_amp,&pixels_ss, beamflag,bath,amp,bathacrosstrack,bathalongtrack, ss,ssacrosstrack,ssalongtrack, comment,&error); /* print debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Ping read in program <%s>\n", program_name); fprintf(stderr,"dbg2 kind: %d\n",kind); fprintf(stderr,"dbg2 error: %d\n",error); fprintf(stderr,"dbg2 status: %d\n",status); } /* deal with nav and time from survey data only - not nav, sidescan, or subbottom */ if (error <= MB_ERROR_NO_ERROR && kind == MB_DATA_DATA) { /* flag positions and times for output at specified interval */ if (nread == 0 || time_d - savetime_d >= interval) { savetime_d = time_d; output = MB_YES; } lasttime_d = time_d; lastlon = navlon; lastlat = navlat; /* increment counter */ nread++; } /* output position and time if flagged or end of file */ if (output == MB_YES || error == MB_ERROR_EOF) { if (lastlon < 0.0) lastlon += 360.0; mb_get_date(verbose, lasttime_d, time_i); fprintf(tfp, "%.6f %.6f %4.4d %2.2d %2.2d %2.2d %2.2d %2.2d\n", lastlat, lastlon, time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5]); } } /* close the swath file */ status = mb_close(verbose,&mbio_ptr,&error); /* output read statistics */ fprintf(stderr,"%d records read from %s\n", nread, file); /* close the llt file */ fclose(tfp); /* call predict_tide with popen */ sprintf(predict_tide, "%s/predict_tide", otps_location_use); if ((tfp = popen(predict_tide, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open predict_time program using popen()\n"); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } /* send relevant input to predict_tide through its stdin stream */ fprintf(tfp, "%s/DATA/Model_%s\n", otps_location_use,otps_model); fprintf(tfp, "%s\n", lltfile); fprintf(tfp, "z\n\nAP\noce\n1\n"); /*fprintf(tfp, "z\nm2,s2,n2,k2,k1,o1,p1,q1\nAP\noce\n1\n");*/ fprintf(tfp, "%s\n", otpsfile); /* close the process */ pclose(tfp); /* now read results from predict_tide and rewrite them in a useful form */ if ((tfp = fopen(otpsfile, "r")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open predict_time results temporary file <%s>\n", otpsfile); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } if ((ofp = fopen(tidefile, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open tide output file <%s>\n", tidefile); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(MB_FAILURE); } fprintf(ofp, "# Tide model generated by program %s\n", program_name); fprintf(ofp, "# Version: %s\n", rcs_id); fprintf(ofp, "# MB-System Version: %s\n", MB_VERSION); fprintf(ofp, "# Tide model generated by program %s\n", program_name); fprintf(ofp, "# which in turn calls OTPS program predict_tide obtained from:\n"); fprintf(ofp, "# http://www.coas.oregonstate.edu/research/po/research/tide/\n"); right_now = time((time_t *)0); strcpy(date,ctime(&right_now)); date[strlen(date)-1] = '\0'; if ((user_ptr = getenv("USER")) == NULL) user_ptr = getenv("LOGNAME"); if (user_ptr != NULL) strcpy(user,user_ptr); else strcpy(user, "unknown"); gethostname(host,MBP_FILENAMESIZE); fprintf(ofp,"# Run by user <%s> on cpu <%s> at <%s>\n", user,host,date); nline = 0; ngood = 0; while ((result = fgets(line,MB_PATH_MAXLINE,tfp)) == line) { nline++; if (nline == 2 || nline == 3) { fprintf(ofp, "#%s", line); } else if (nline > 6) { nget = sscanf(line,"%lf %lf %d.%d.%d %d:%d:%d %lf %lf", &lat, &lon, &time_i[1], &time_i[2], &time_i[0], &time_i[3], &time_i[4], &time_i[5], &tide, &depth); if (nget == 10) { ngood++; if (tideformat == 2) { fprintf(ofp, "%4.4d %2.2d %2.2d %2.2d %2.2d %2.2d %9.4f\n", time_i[0], time_i[1], time_i[2], time_i[3], time_i[4], time_i[5], tide); } else { mb_get_time(verbose,time_i,&time_d); fprintf(ofp, "%.3f %9.4f\n",time_d, tide); } } } } fclose(tfp); fclose(ofp); /* remove the temporary files */ unlink(lltfile); unlink(otpsfile); /* some helpful output */ fprintf(stderr, "\nResults are really in %s\n", tidefile); /* set mbprocess usage of tide file */ if (mbprocess_update == MB_YES && ngood > 0) { status = mb_pr_update_tide(verbose, swath_file, MBP_TIDE_ON, tidefile, tideformat, &error); fprintf(stderr, "MBprocess set to apply tide correction to %s\n", swath_file); } /* figure out whether and what to read next */ if (read_datalist == MB_YES) { if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } else { read_data = MB_NO; } /* end loop over files in list */ } if (read_datalist == MB_YES) mb_datalist_close(verbose,&datalist,&error); } /* check memory */ if (verbose >= 4) status = mb_memory_list(verbose,&error); /* print output debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Program <%s> completed\n", program_name); fprintf(stderr,"dbg2 Ending status:\n"); fprintf(stderr,"dbg2 status: %d\n",status); } /* end it all */ exit(error); }
int main (int argc, char **argv) { char program_name[] = "mbctdlist"; char help_message[] = "mbctdlist lists all CTD records within swath data files\nThe -O option specifies how the values are output\nin an mblist-likefashion.\n"; char usage_message[] = "mbctdlist [-A -Ddecimate -Fformat -Gdelimeter -H -Ifile -Llonflip -Ooutput_format -V -Zsegment]"; extern char *optarg; int errflg = 0; int c; int help = 0; int flag = 0; /* MBIO status variables */ int status = MB_SUCCESS; int interp_status = MB_SUCCESS; int verbose = 0; int error = MB_ERROR_NO_ERROR; char *message; /* MBIO read control parameters */ int read_datalist = MB_NO; char read_file[MB_PATH_MAXLINE]; void *datalist; int look_processed = MB_DATALIST_LOOK_UNSET; double file_weight; int format; int pings; int decimate; int lonflip; double bounds[4]; int btime_i[7]; int etime_i[7]; double btime_d; double etime_d; double speedmin; double timegap; char file[MB_PATH_MAXLINE]; int beams_bath; int beams_amp; int pixels_ss; /* output format list controls */ char list[MAX_OPTIONS]; int n_list; double distance_total = 0.0; int time_j[5]; int mblist_next_value = MB_NO; int invert_next_value = MB_NO; int signflip_next_value = MB_NO; int first = MB_YES; int ascii = MB_YES; int segment = MB_NO; char segment_tag[MB_PATH_MAXLINE]; char delimiter[MB_PATH_MAXLINE]; /* MBIO read values */ void *mbio_ptr = NULL; void *store_ptr; int kind; int time_i[7]; double time_d; double navlon; double navlat; double speed; double heading; double distance; double altitude; double sonardepth; char *beamflag = NULL; double *bath = NULL; double *bathacrosstrack = NULL; double *bathalongtrack = NULL; double *amp = NULL; double *ss = NULL; double *ssacrosstrack = NULL; double *ssalongtrack = NULL; char comment[MB_COMMENT_MAXLINE]; /* navigation, heading, attitude data */ int survey_count = 0; int survey_count_tot = 0; int nnav = 0; int nnav_alloc = 0; double *nav_time_d = NULL; double *nav_lon = NULL; double *nav_lat = NULL; double *nav_sonardepth = NULL; double *nav_heading = NULL; double *nav_speed = NULL; double *nav_altitude = NULL; /* CTD values */ int ctd_count = 0; int ctd_count_tot = 0; int nctd; double ctd_time_d[MB_CTD_MAX]; double ctd_conductivity[MB_CTD_MAX]; double ctd_temperature[MB_CTD_MAX]; double ctd_depth[MB_CTD_MAX]; double ctd_salinity[MB_CTD_MAX]; double ctd_soundspeed[MB_CTD_MAX]; int nsensor; double sensor_time_d[MB_CTD_MAX]; double sensor1[MB_CTD_MAX]; double sensor2[MB_CTD_MAX]; double sensor3[MB_CTD_MAX]; double sensor4[MB_CTD_MAX]; double sensor5[MB_CTD_MAX]; double sensor6[MB_CTD_MAX]; double sensor7[MB_CTD_MAX]; double sensor8[MB_CTD_MAX]; double conductivity; double temperature; double potentialtemperature; double depth; double salinity; double soundspeed; /* additional time variables */ int first_m = MB_YES; double time_d_ref; int first_u = MB_YES; time_t time_u; time_t time_u_ref; double seconds; /* course calculation variables */ double dlon, dlat, minutes; int degrees; char hemi; double headingx, headingy, mtodeglon, mtodeglat; double course, course_old; double time_d_old; double time_interval; double speed_made_good, speed_made_good_old; double navlon_old, navlat_old; double dx, dy; double b; int read_data; int ictd; int i, j; /* get current default values */ status = mb_defaults(verbose,&format,&pings,&lonflip,bounds, btime_i,etime_i,&speedmin,&timegap); pings = 1; bounds[0] = -360.0; bounds[1] = 360.0; bounds[2] = -90.0; bounds[3] = 90.0; ctd_count = 0; ctd_count_tot = 0; /* set default input to datalist.mb-1 */ strcpy (read_file, "datalist.mb-1"); /* set up the default list controls (Time, lon, lat, conductivity, temperature, depth, salinity, sound speed) */ list[0]='T'; list[1]='X'; list[2]='Y'; list[3]='H'; list[4]='C'; list[5]='c'; list[6]='^'; list[7]='c'; list[8]='S'; list[9]='s'; n_list = 10; sprintf(delimiter, "\t"); decimate = 1; /* process argument list */ while ((c = getopt(argc, argv, "AaDdF:f:G:g:I:i:L:l:O:o:Z:z:VvHh")) != -1) switch (c) { case 'H': case 'h': help++; break; case 'V': case 'v': verbose++; break; case 'A': case 'a': ascii = MB_NO; flag++; break; case 'D': case 'd': sscanf (optarg,"%d", &decimate); flag++; break; case 'F': case 'f': sscanf (optarg,"%d", &format); flag++; break; case 'G': case 'g': sscanf (optarg,"%s", delimiter); flag++; break; case 'I': case 'i': sscanf (optarg,"%s", read_file); flag++; break; case 'L': case 'l': sscanf (optarg,"%d", &lonflip); flag++; break; case 'O': case 'o': for(j=0,n_list=0;j<(int)strlen(optarg);j++,n_list++) if (n_list<MAX_OPTIONS) list[n_list] = optarg[j]; break; case 'Z': case 'z': segment = MB_YES; sscanf (optarg,"%s", segment_tag); flag++; break; case '?': errflg++; } /* if error flagged then print it and exit */ if (errflg) { fprintf(stderr,"usage: %s\n", usage_message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); error = MB_ERROR_BAD_USAGE; exit(error); } /* print starting message */ if (verbose == 1 || help) { fprintf(stderr,"\nProgram %s\n",program_name); fprintf(stderr,"Version %s\n",rcs_id); fprintf(stderr,"MB-system Version %s\n",MB_VERSION); } /* print starting debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Program <%s>\n",program_name); fprintf(stderr,"dbg2 Version %s\n",rcs_id); fprintf(stderr,"dbg2 MB-system Version %s\n",MB_VERSION); fprintf(stderr,"dbg2 Control Parameters:\n"); fprintf(stderr,"dbg2 verbose: %d\n",verbose); fprintf(stderr,"dbg2 help: %d\n",help); fprintf(stderr,"dbg2 format: %d\n",format); fprintf(stderr,"dbg2 pings: %d\n",pings); fprintf(stderr,"dbg2 lonflip: %d\n",lonflip); fprintf(stderr,"dbg2 decimate: %d\n",decimate); fprintf(stderr,"dbg2 bounds[0]: %f\n",bounds[0]); fprintf(stderr,"dbg2 bounds[1]: %f\n",bounds[1]); fprintf(stderr,"dbg2 bounds[2]: %f\n",bounds[2]); fprintf(stderr,"dbg2 bounds[3]: %f\n",bounds[3]); fprintf(stderr,"dbg2 btime_i[0]: %d\n",btime_i[0]); fprintf(stderr,"dbg2 btime_i[1]: %d\n",btime_i[1]); fprintf(stderr,"dbg2 btime_i[2]: %d\n",btime_i[2]); fprintf(stderr,"dbg2 btime_i[3]: %d\n",btime_i[3]); fprintf(stderr,"dbg2 btime_i[4]: %d\n",btime_i[4]); fprintf(stderr,"dbg2 btime_i[5]: %d\n",btime_i[5]); fprintf(stderr,"dbg2 btime_i[6]: %d\n",btime_i[6]); fprintf(stderr,"dbg2 etime_i[0]: %d\n",etime_i[0]); fprintf(stderr,"dbg2 etime_i[1]: %d\n",etime_i[1]); fprintf(stderr,"dbg2 etime_i[2]: %d\n",etime_i[2]); fprintf(stderr,"dbg2 etime_i[3]: %d\n",etime_i[3]); fprintf(stderr,"dbg2 etime_i[4]: %d\n",etime_i[4]); fprintf(stderr,"dbg2 etime_i[5]: %d\n",etime_i[5]); fprintf(stderr,"dbg2 etime_i[6]: %d\n",etime_i[6]); fprintf(stderr,"dbg2 speedmin: %f\n",speedmin); fprintf(stderr,"dbg2 timegap: %f\n",timegap); fprintf(stderr,"dbg2 ascii: %d\n",ascii); fprintf(stderr,"dbg2 segment: %d\n",segment); fprintf(stderr,"dbg2 segment_tag: %s\n",segment_tag); fprintf(stderr,"dbg2 delimiter: %s\n",delimiter); fprintf(stderr,"dbg2 file: %s\n",file); fprintf(stderr,"dbg2 n_list: %d\n",n_list); for (i=0;i<n_list;i++) fprintf(stderr,"dbg2 list[%d]: %c\n", i,list[i]); } /* if help desired then print it and exit */ if (help) { fprintf(stderr,"\n%s\n",help_message); fprintf(stderr,"\nusage: %s\n", usage_message); exit(error); } /* get format if required */ if (format == 0) mb_get_format(verbose,read_file,NULL,&format,&error); /* determine whether to read one file or a list of files */ if (format < 0) read_datalist = MB_YES; /**************************************************************************************/ /* section 1 - read all data and save nav etc for interpolation onto ctd data */ /* open file list */ if (read_datalist == MB_YES) { if ((status = mb_datalist_open(verbose,&datalist, read_file,look_processed,&error)) != MB_SUCCESS) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open data list file: %s\n", read_file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } /* else copy single filename to be read */ else { strcpy(file, read_file); read_data = MB_YES; } /* loop over all files to be read */ while (read_data == MB_YES) { /* initialize reading the swath file */ if ((status = mb_read_init( verbose,file,format,pings,lonflip,bounds, btime_i,etime_i,speedmin,timegap, &mbio_ptr,&btime_d,&etime_d, &beams_bath,&beams_amp,&pixels_ss,&error)) != MB_SUCCESS) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error returned from function <mb_read_init>:\n%s\n",message); fprintf(stderr,"\nMultibeam File <%s> not initialized for reading\n",file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* allocate memory for data arrays */ if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(char), (void **)&beamflag, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bath, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_AMPLITUDE, sizeof(double), (void **)&, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathalongtrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ss, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssalongtrack, &error); /* if error initializing memory then quit */ if (error != MB_ERROR_NO_ERROR) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error allocating data arrays:\n%s\n", message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* output separator for GMT style segment file output */ if (segment == MB_YES && ascii == MB_YES) { printf("%s\n", segment_tag); } /* output info */ if (verbose >= 1) { fprintf(stderr, "\nSearching %s for survey records\n", file); } /* read and print data */ survey_count = 0; first = MB_YES; while (error <= MB_ERROR_NO_ERROR) { /* read a data record */ status = mb_get_all(verbose,mbio_ptr,&store_ptr,&kind, time_i,&time_d,&navlon,&navlat, &speed,&heading, &distance,&altitude,&sonardepth, &beams_bath,&beams_amp,&pixels_ss, beamflag,bath,amp,bathacrosstrack,bathalongtrack, ss,ssacrosstrack,ssalongtrack, comment,&error); /* print debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Ping read in program <%s>\n", program_name); fprintf(stderr,"dbg2 kind: %d\n",kind); fprintf(stderr,"dbg2 error: %d\n",error); fprintf(stderr,"dbg2 status: %d\n",status); } /* if survey data save the nav etc */ if (error <= MB_ERROR_NO_ERROR && kind == MB_DATA_DATA) { /* allocate memory for navigation/attitude arrays if needed */ if (nnav + 1 >= nnav_alloc) { nnav_alloc += MBCTDLIST_ALLOC_CHUNK; status = mb_reallocd(verbose,__FILE__,__LINE__,nnav_alloc*sizeof(double),(void **)&nav_time_d,&error); status = mb_reallocd(verbose,__FILE__,__LINE__,nnav_alloc*sizeof(double),(void **)&nav_lon,&error); status = mb_reallocd(verbose,__FILE__,__LINE__,nnav_alloc*sizeof(double),(void **)&nav_lat,&error); status = mb_reallocd(verbose,__FILE__,__LINE__,nnav_alloc*sizeof(double),(void **)&nav_speed,&error); status = mb_reallocd(verbose,__FILE__,__LINE__,nnav_alloc*sizeof(double),(void **)&nav_sonardepth,&error); status = mb_reallocd(verbose,__FILE__,__LINE__,nnav_alloc*sizeof(double),(void **)&nav_heading,&error); status = mb_reallocd(verbose,__FILE__,__LINE__,nnav_alloc*sizeof(double),(void **)&nav_altitude,&error); if (error != MB_ERROR_NO_ERROR) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error allocating data arrays:\n%s\n",message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } } /* save the nav etc */ if (nnav == 0 || time_d > nav_time_d[nnav-1]) { nav_time_d[nnav] = time_d; nav_lon[nnav] = navlon; nav_lat[nnav] = navlat; nav_speed[nnav] = speed; nav_sonardepth[nnav] = sonardepth; nav_heading[nnav] = heading; nav_altitude[nnav] = altitude; nnav++; } survey_count++; survey_count_tot++; } } /* close the swath file */ status = mb_close(verbose,&mbio_ptr,&error); /* output info */ if (verbose >= 1) { fprintf(stderr, "nav extracted from %d survey records\n", survey_count); } /* figure out whether and what to read next */ if (read_datalist == MB_YES) { if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } else { read_data = MB_NO; } /* end loop over files in list */ } if (read_datalist == MB_YES) mb_datalist_close(verbose,&datalist,&error); /* output info */ if (verbose >= 1) { fprintf(stderr, "\nTotal %d survey records\n", survey_count_tot); } /**************************************************************************************/ /* section 2 - read data and output ctd data with time interpolation of nav etc */ /* open file list */ if (read_datalist == MB_YES) { if ((status = mb_datalist_open(verbose,&datalist, read_file,look_processed,&error)) != MB_SUCCESS) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open data list file: %s\n", read_file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } /* else copy single filename to be read */ else { strcpy(file, read_file); read_data = MB_YES; } /* loop over all files to be read */ while (read_data == MB_YES) { /* initialize reading the swath file */ if ((status = mb_read_init( verbose,file,format,pings,lonflip,bounds, btime_i,etime_i,speedmin,timegap, &mbio_ptr,&btime_d,&etime_d, &beams_bath,&beams_amp,&pixels_ss,&error)) != MB_SUCCESS) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error returned from function <mb_read_init>:\n%s\n",message); fprintf(stderr,"\nMultibeam File <%s> not initialized for reading\n",file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* allocate memory for data arrays */ if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(char), (void **)&beamflag, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bath, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_AMPLITUDE, sizeof(double), (void **)&, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathalongtrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ss, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssalongtrack, &error); /* if error initializing memory then quit */ if (error != MB_ERROR_NO_ERROR) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error allocating data arrays:\n%s\n", message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* output info */ if (verbose >= 1) { fprintf(stderr, "\nSearching %s for CTD records\n", file); } /* read and print data */ ctd_count = 0; first = MB_YES; while (error <= MB_ERROR_NO_ERROR) { /* read a data record */ status = mb_get_all(verbose,mbio_ptr,&store_ptr,&kind, time_i,&time_d,&navlon,&navlat, &speed,&heading, &distance,&altitude,&sonardepth, &beams_bath,&beams_amp,&pixels_ss, beamflag,bath,amp,bathacrosstrack,bathalongtrack, ss,ssacrosstrack,ssalongtrack, comment,&error); /* print debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Ping read in program <%s>\n", program_name); fprintf(stderr,"dbg2 kind: %d\n",kind); fprintf(stderr,"dbg2 error: %d\n",error); fprintf(stderr,"dbg2 status: %d\n",status); } /* if ctd then extract data */ if (error <= MB_ERROR_NO_ERROR && (kind == MB_DATA_CTD || kind == MB_DATA_SSV)) { /* extract ctd */ status = mb_ctd(verbose, mbio_ptr, store_ptr, &kind, &nctd, ctd_time_d, ctd_conductivity, ctd_temperature, ctd_depth, ctd_salinity, ctd_soundspeed, &error); /* extract ancilliary sensor data */ status = mb_ancilliarysensor(verbose, mbio_ptr, store_ptr, &kind, &nsensor, sensor_time_d, sensor1, sensor2, sensor3, sensor4, sensor5, sensor6, sensor7, sensor8, &error); /* loop over the nctd ctd points, outputting each one */ if (error == MB_ERROR_NO_ERROR && nctd > 0) { for (ictd=0;ictd<nctd;ictd++) { /* get data */ time_d = ctd_time_d[ictd]; mb_get_date(verbose, time_d, time_i); conductivity = ctd_conductivity[ictd]; temperature = ctd_temperature[ictd]; depth = ctd_depth[ictd]; salinity = ctd_salinity[ictd]; soundspeed = ctd_soundspeed[ictd]; /* get navigation */ j = 0; speed = 0.0; interp_status = mb_linear_interp_longitude(verbose, nav_time_d-1, nav_lon-1, nnav, time_d, &navlon, &j, &error); if (interp_status == MB_SUCCESS) interp_status = mb_linear_interp_latitude(verbose, nav_time_d-1, nav_lat-1, nnav, time_d, &navlat, &j, &error); if (interp_status == MB_SUCCESS) interp_status = mb_linear_interp_heading(verbose, nav_time_d-1, nav_heading-1, nnav, time_d, &heading, &j, &error); if (interp_status == MB_SUCCESS) interp_status = mb_linear_interp(verbose, nav_time_d-1, nav_sonardepth-1, nnav, time_d, &sonardepth, &j, &error); if (interp_status == MB_SUCCESS) interp_status = mb_linear_interp(verbose, nav_time_d-1, nav_altitude-1, nnav, time_d, &altitude, &j, &error); if (interp_status == MB_SUCCESS) interp_status = mb_linear_interp(verbose, nav_time_d-1, nav_speed-1, nnav, time_d, &speed, &j, &error); /* only output if interpolation of nav etc has worked */ if (interp_status == MB_YES) { /* calculate course made good and distance */ mb_coor_scale(verbose,navlat, &mtodeglon, &mtodeglat); headingx = sin(DTR * heading); headingy = cos(DTR * heading); if (first == MB_YES) { time_interval = 0.0; course = heading; speed_made_good = 0.0; course_old = heading; speed_made_good_old = speed; distance = 0.0; } else { time_interval = time_d - time_d_old; dx = (navlon - navlon_old)/mtodeglon; dy = (navlat - navlat_old)/mtodeglat; distance = sqrt(dx*dx + dy*dy); if (distance > 0.0) course = RTD*atan2(dx/distance,dy/distance); else course = course_old; if (course < 0.0) course = course + 360.0; if (time_interval > 0.0) speed_made_good = 3.6*distance/time_interval; else speed_made_good = speed_made_good_old; } distance_total += 0.001 * distance; /* reset old values */ navlon_old = navlon; navlat_old = navlat; course_old = course; speed_made_good_old = speed_made_good; time_d_old = time_d; /* now loop over list of output parameters */ ctd_count++; ctd_count_tot++; if (nctd % decimate == 0) for (i=0; i<n_list; i++) { switch (list[i]) { case '/': /* Inverts next simple value */ invert_next_value = MB_YES; break; case '-': /* Flip sign on next simple value */ signflip_next_value = MB_YES; break; case '^': /* use mblist definitions of CcSsTt */ mblist_next_value = MB_YES; break; case '1': /* Sensor 1 - volts */ printsimplevalue(verbose, sensor1[ictd], 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case '2': /* Sensor 2 - volts */ printsimplevalue(verbose, sensor2[ictd], 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case '3': /* Sensor 3 - volts */ printsimplevalue(verbose, sensor3[ictd], 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case '4': /* Sensor 4 - volts */ printsimplevalue(verbose, sensor4[ictd], 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case '5': /* Sensor 5 - volts */ printsimplevalue(verbose, sensor5[ictd], 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case '6': /* Sensor 6 - volts */ printsimplevalue(verbose, sensor6[ictd], 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case '7': /* Sensor 7 - volts */ printsimplevalue(verbose, sensor7[ictd], 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case '8': /* Sensor 8 - volts */ printsimplevalue(verbose, sensor8[ictd], 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'C': /* Conductivity or Sonar altitude (m) */ if (mblist_next_value == MB_NO) printsimplevalue(verbose, conductivity, 0, 5, ascii, &invert_next_value, &signflip_next_value, &error); else { printsimplevalue(verbose, altitude, 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); mblist_next_value = MB_NO; } break; case 'c': /* Temperature or sonar transducer depth (m) */ if (mblist_next_value == MB_NO) printsimplevalue(verbose, temperature, 0, 5, ascii, &invert_next_value, &signflip_next_value, &error); else { printsimplevalue(verbose, sonardepth, 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); mblist_next_value = MB_NO; } break; case 'H': /* heading */ printsimplevalue(verbose, heading, 6, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'h': /* course */ printsimplevalue(verbose, course, 6, 2, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'J': /* time string */ mb_get_jtime(verbose,time_i,time_j); seconds = time_i[5] + 0.000001 * time_i[6]; if (ascii == MB_YES) { printf("%.4d %.3d %.2d %.2d %9.6f", time_j[0],time_j[1], time_i[3],time_i[4], seconds); } else { b = time_j[0]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[1]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[3]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[4]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[5]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[6]; fwrite(&b, sizeof(double), 1, stdout); } break; case 'j': /* time string */ mb_get_jtime(verbose,time_i,time_j); seconds = time_i[5] + 0.000001 * time_i[6]; if (ascii == MB_YES) { printf("%.4d %.3d %.4d %9.6f", time_j[0],time_j[1], time_j[2],seconds); } else { b = time_j[0]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[1]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[2]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[3]; fwrite(&b, sizeof(double), 1, stdout); b = time_j[4]; fwrite(&b, sizeof(double), 1, stdout); } break; case 'L': /* along-track distance (km) */ printsimplevalue(verbose, distance_total, 7, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'l': /* along-track distance (m) */ printsimplevalue(verbose, 1000.0 * distance_total, 7, 3, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'M': /* Decimal unix seconds since 1/1/70 00:00:00 */ printsimplevalue(verbose, time_d, 0, 6, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'm': /* time in decimal seconds since first record */ if (first_m == MB_YES) { time_d_ref = time_d; first_m = MB_NO; } b = time_d - time_d_ref; printsimplevalue(verbose, b, 0, 6, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'P': /* potential temperature (degrees) */ /* approximation taken from http://mason.gmu.edu/~bklinger/seawater.pdf on 4/25/2012 - to be replaced by a better calculation at some point */ potentialtemperature = temperature - 0.04 * (1.0 + 0.185 * temperature + 0.35 * (salinity - 35.0)) * (sonardepth / 1000.0) - 0.0075 * (1.0 - temperature / 30.0) * (sonardepth * sonardepth / 1000000.0); printsimplevalue(verbose, potentialtemperature, 0, 5, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'S': /* salinity or speed */ if (mblist_next_value == MB_NO) printsimplevalue(verbose, salinity, 0, 5, ascii, &invert_next_value, &signflip_next_value, &error); else { printsimplevalue(verbose, speed, 5, 2, ascii, &invert_next_value, &signflip_next_value, &error); mblist_next_value = MB_NO; } break; case 's': /* speed made good */ if (mblist_next_value == MB_NO) printsimplevalue(verbose, soundspeed, 0, 3, ascii, &invert_next_value, &signflip_next_value, &error); else { printsimplevalue(verbose, speed_made_good, 5, 2, ascii, &invert_next_value, &signflip_next_value, &error); mblist_next_value = MB_NO; } break; case 'T': /* yyyy/mm/dd/hh/mm/ss time string */ seconds = time_i[5] + 1e-6 * time_i[6]; if (ascii == MB_YES) printf("%.4d/%.2d/%.2d/%.2d/%.2d/%9.6f", time_i[0],time_i[1],time_i[2], time_i[3],time_i[4],seconds); else { b = time_i[0]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[1]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[2]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[3]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[4]; fwrite(&b, sizeof(double), 1, stdout); b = seconds; fwrite(&b, sizeof(double), 1, stdout); } break; case 't': /* yyyy mm dd hh mm ss time string */ seconds = time_i[5] + 1e-6 * time_i[6]; if (ascii == MB_YES) printf("%.4d %.2d %.2d %.2d %.2d %9.6f", time_i[0],time_i[1],time_i[2], time_i[3],time_i[4],seconds); else { b = time_i[0]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[1]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[2]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[3]; fwrite(&b, sizeof(double), 1, stdout); b = time_i[4]; fwrite(&b, sizeof(double), 1, stdout); b = seconds; fwrite(&b, sizeof(double), 1, stdout); } break; case 'U': /* unix time in seconds since 1/1/70 00:00:00 */ time_u = (int) time_d; if (ascii == MB_YES) printf("%ld",time_u); else { b = time_u; fwrite(&b, sizeof(double), 1, stdout); } break; case 'u': /* time in seconds since first record */ time_u = (int) time_d; if (first_u == MB_YES) { time_u_ref = time_u; first_u = MB_NO; } if (ascii == MB_YES) printf("%ld",time_u - time_u_ref); else { b = time_u - time_u_ref; fwrite(&b, sizeof(double), 1, stdout); } break; case 'V': /* time in seconds since last value */ case 'v': if (ascii == MB_YES) { if ( fabs(time_interval) > 100. ) printf("%g",time_interval); else printf("%7.3f",time_interval); } else { fwrite(&time_interval, sizeof(double), 1, stdout); } break; case 'X': /* longitude decimal degrees */ dlon = navlon; printsimplevalue(verbose, dlon, 11, 6, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'x': /* longitude degress + decimal minutes */ dlon = navlon; if (dlon < 0.0) { hemi = 'W'; dlon = -dlon; } else hemi = 'E'; degrees = (int) dlon; minutes = 60.0*(dlon - degrees); if (ascii == MB_YES) { printf("%3d %8.5f%c", degrees, minutes, hemi); } else { b = degrees; if (hemi == 'W') b = -b; fwrite(&b, sizeof(double), 1, stdout); b = minutes; fwrite(&b, sizeof(double), 1, stdout); } break; case 'Y': /* latitude decimal degrees */ dlat = navlat; printsimplevalue(verbose, dlat, 11, 6, ascii, &invert_next_value, &signflip_next_value, &error); break; case 'y': /* latitude degrees + decimal minutes */ dlat = navlat; if (dlat < 0.0) { hemi = 'S'; dlat = -dlat; } else hemi = 'N'; degrees = (int) dlat; minutes = 60.0*(dlat - degrees); if (ascii == MB_YES) { printf("%3d %8.5f%c", degrees, minutes, hemi); } else { b = degrees; if (hemi == 'S') b = -b; fwrite(&b, sizeof(double), 1, stdout); b = minutes; fwrite(&b, sizeof(double), 1, stdout); } break; default: if (ascii == MB_YES) printf("<Invalid Option: %c>", list[i]); break; } if (ascii == MB_YES) { if (i<(n_list-1)) printf ("%s", delimiter); else printf ("\n"); } } first = MB_NO; } } } } /* else if survey data ignore */ else if (error <= MB_ERROR_NO_ERROR && kind == MB_DATA_DATA) { } } /* close the swath file */ status = mb_close(verbose,&mbio_ptr,&error); /* output info */ if (verbose >= 1) { fprintf(stderr, "%d CTD records\n", ctd_count); } /* figure out whether and what to read next */ if (read_datalist == MB_YES) { if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } else { read_data = MB_NO; } /* end loop over files in list */ } if (read_datalist == MB_YES) mb_datalist_close(verbose,&datalist,&error); /* output info */ if (verbose >= 1) { fprintf(stderr, "\nTotal %d CTD records\n", ctd_count_tot); } /* deallocate navigation arrays */ if (nnav > 0) { status = mb_freed(verbose,__FILE__,__LINE__,(void **)&nav_time_d,&error); status = mb_freed(verbose,__FILE__,__LINE__,(void **)&nav_lon,&error); status = mb_freed(verbose,__FILE__,__LINE__,(void **)&nav_lat,&error); status = mb_freed(verbose,__FILE__,__LINE__,(void **)&nav_speed,&error); status = mb_freed(verbose,__FILE__,__LINE__,(void **)&nav_sonardepth,&error); status = mb_freed(verbose,__FILE__,__LINE__,(void **)&nav_heading,&error); status = mb_freed(verbose,__FILE__,__LINE__,(void **)&nav_altitude,&error); } /* check memory */ if (verbose >= 4) status = mb_memory_list(verbose,&error); /* print output debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Program <%s> completed\n", program_name); fprintf(stderr,"dbg2 Ending status:\n"); fprintf(stderr,"dbg2 status: %d\n",status); } /* end it all */ exit(error); }
int main (int argc, char **argv) { char program_name[] = "MBroutetime"; char help_message[] = "MBroutetime outputs a list of the times when a survey hit the waypoints\nof a planned survey route. This (lon lat time_d) list can then be used by mbextractsegy\nor mb7k2ss to extract subbottom (or sidescan) data into files corresponding\nto the lines between waypoints."; char usage_message[] = "mbroutetime -Rroutefile [-Fformat -Ifile -Owaypointtimefile -Urangethreshold -H -V]"; extern char *optarg; int errflg = 0; int c; int help = 0; int flag = 0; /* MBIO status variables */ int status = MB_SUCCESS; int verbose = 0; int error = MB_ERROR_NO_ERROR; char *message; /* MBIO read control parameters */ int read_datalist = MB_NO; char read_file[MB_PATH_MAXLINE]; char output_file[MB_PATH_MAXLINE]; int output_file_set = MB_NO; void *datalist; int look_processed = MB_DATALIST_LOOK_UNSET; double file_weight; int format; int pings; int lonflip; double bounds[4]; int btime_i[7]; int etime_i[7]; double btime_d; double etime_d; double speedmin; double timegap; char file[MB_PATH_MAXLINE]; int beams_bath; int beams_amp; int pixels_ss; /* MBIO read values */ void *mbio_ptr = NULL; void *store_ptr = NULL; int kind; int time_i[7]; double time_d; double navlon; double navlat; double speed; double heading; double distance; double altitude; double sonardepth; char *beamflag = NULL; double *bath = NULL; double *bathacrosstrack = NULL; double *bathalongtrack = NULL; double *amp = NULL; double *ss = NULL; double *ssacrosstrack = NULL; double *ssalongtrack = NULL; char comment[MB_COMMENT_MAXLINE]; /* route and auto-line data */ char route_file[MB_PATH_MAXLINE]; int rawroutefile = MB_NO; int nroutepoint = 0; int nroutepointfound = 0; int nroutepointalloc = 0; double lon; double lat; double topo; int waypoint; double *routelon = NULL; double *routelat = NULL; double *routeheading = NULL; int *routewaypoint = NULL; double *routetime_d = NULL; double range; double rangethreshold = 25.0; double rangelast; int activewaypoint = 0; double mtodeglon, mtodeglat; double lastlon; double lastlat; double lastheading; double lasttime_d; double dx, dy; FILE *fp = NULL; char *result; int nget; int point_ok; int read_data; int nread; int i; /* get current default values */ status = mb_defaults(verbose,&format,&pings,&lonflip,bounds, btime_i,etime_i,&speedmin,&timegap); /* set default input to datalist.mb-1 */ strcpy (read_file, "datalist.mb-1"); /* process argument list */ while ((c = getopt(argc, argv, "F:f:I:i:O:o:R:r:U:u:VvHh")) != -1) switch (c) { case 'H': case 'h': help++; break; case 'V': case 'v': verbose++; break; case 'F': case 'f': sscanf (optarg,"%d", &format); flag++; break; case 'I': case 'i': sscanf (optarg,"%s", read_file); flag++; break; case 'O': case 'o': sscanf (optarg,"%s", output_file); output_file_set = MB_YES; flag++; break; case 'R': case 'r': sscanf (optarg,"%s", route_file); flag++; break; case 'U': case 'u': sscanf (optarg,"%lf", &rangethreshold); flag++; break; case '?': errflg++; } /* if error flagged then print it and exit */ if (errflg) { fprintf(stderr,"usage: %s\n", usage_message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); error = MB_ERROR_BAD_USAGE; exit(error); } /* print starting message */ if (verbose == 1 || help) { fprintf(stderr,"\nProgram %s\n",program_name); fprintf(stderr,"Version %s\n",rcs_id); fprintf(stderr,"MB-system Version %s\n",MB_VERSION); } /* print starting debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Program <%s>\n",program_name); fprintf(stderr,"dbg2 Version %s\n",rcs_id); fprintf(stderr,"dbg2 MB-system Version %s\n",MB_VERSION); fprintf(stderr,"dbg2 Control Parameters:\n"); fprintf(stderr,"dbg2 verbose: %d\n",verbose); fprintf(stderr,"dbg2 help: %d\n",help); fprintf(stderr,"dbg2 format: %d\n",format); fprintf(stderr,"dbg2 pings: %d\n",pings); fprintf(stderr,"dbg2 lonflip: %d\n",lonflip); fprintf(stderr,"dbg2 bounds[0]: %f\n",bounds[0]); fprintf(stderr,"dbg2 bounds[1]: %f\n",bounds[1]); fprintf(stderr,"dbg2 bounds[2]: %f\n",bounds[2]); fprintf(stderr,"dbg2 bounds[3]: %f\n",bounds[3]); fprintf(stderr,"dbg2 btime_i[0]: %d\n",btime_i[0]); fprintf(stderr,"dbg2 btime_i[1]: %d\n",btime_i[1]); fprintf(stderr,"dbg2 btime_i[2]: %d\n",btime_i[2]); fprintf(stderr,"dbg2 btime_i[3]: %d\n",btime_i[3]); fprintf(stderr,"dbg2 btime_i[4]: %d\n",btime_i[4]); fprintf(stderr,"dbg2 btime_i[5]: %d\n",btime_i[5]); fprintf(stderr,"dbg2 btime_i[6]: %d\n",btime_i[6]); fprintf(stderr,"dbg2 etime_i[0]: %d\n",etime_i[0]); fprintf(stderr,"dbg2 etime_i[1]: %d\n",etime_i[1]); fprintf(stderr,"dbg2 etime_i[2]: %d\n",etime_i[2]); fprintf(stderr,"dbg2 etime_i[3]: %d\n",etime_i[3]); fprintf(stderr,"dbg2 etime_i[4]: %d\n",etime_i[4]); fprintf(stderr,"dbg2 etime_i[5]: %d\n",etime_i[5]); fprintf(stderr,"dbg2 etime_i[6]: %d\n",etime_i[6]); fprintf(stderr,"dbg2 speedmin: %f\n",speedmin); fprintf(stderr,"dbg2 timegap: %f\n",timegap); fprintf(stderr,"dbg2 read_file: %s\n",read_file); fprintf(stderr,"dbg2 route_file: %s\n",route_file); fprintf(stderr,"dbg2 output_file_set: %d\n",output_file_set); fprintf(stderr,"dbg2 output_file: %s\n",output_file); fprintf(stderr,"dbg2 rangethreshold: %f\n",rangethreshold); } /* if help desired then print it and exit */ if (help) { fprintf(stderr,"\n%s\n",help_message); fprintf(stderr,"\nusage: %s\n", usage_message); exit(error); } /* read route file */ if ((fp = fopen(route_file, "r")) == NULL) { error = MB_ERROR_OPEN_FAIL; status = MB_FAILURE; fprintf(stderr,"\nUnable to open route file <%s> for reading\n",route_file); exit(status); } rawroutefile = MB_NO; while ((result = fgets(comment,MB_PATH_MAXLINE,fp)) == comment) { if (comment[0] == '#') { if (strncmp(comment,"## Route File Version", 21) == 0) { rawroutefile = MB_NO; } } else { nget = sscanf(comment,"%lf %lf %lf %d %lf", &lon, &lat, &topo, &waypoint, &heading); if (comment[0] == '#') { fprintf(stderr,"buffer:%s",comment); if (strncmp(comment,"## Route File Version", 21) == 0) { rawroutefile = MB_NO; } } if ((rawroutefile == MB_YES && nget >= 2) || (rawroutefile == MB_NO && nget >= 3 && waypoint > MBES_ROUTE_WAYPOINT_TRANSIT)) point_ok = MB_YES; else point_ok = MB_NO; /* if good data check for need to allocate more space */ if (point_ok == MB_YES && nroutepoint + 2 > nroutepointalloc) { nroutepointalloc += MBES_ALLOC_NUM; status = mb_reallocd(verbose, __FILE__, __LINE__, nroutepointalloc * sizeof(double), (void **)&routelon, &error); status = mb_reallocd(verbose, __FILE__, __LINE__, nroutepointalloc * sizeof(double), (void **)&routelat, &error); status = mb_reallocd(verbose, __FILE__, __LINE__, nroutepointalloc * sizeof(double), (void **)&routeheading, &error); status = mb_reallocd(verbose, __FILE__, __LINE__, nroutepointalloc * sizeof(int), (void **)&routewaypoint, &error); status = mb_reallocd(verbose, __FILE__, __LINE__, nroutepointalloc * sizeof(double), (void **)&routetime_d, &error); if (status != MB_SUCCESS) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error allocating data arrays:\n%s\n", message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } } /* add good point to route */ if (point_ok == MB_YES && nroutepointalloc > nroutepoint) { routelon[nroutepoint] = lon; routelat[nroutepoint] = lat; routeheading[nroutepoint] = heading; routewaypoint[nroutepoint] = waypoint; routetime_d[nroutepoint] = 0.0; nroutepoint++; } } } /* close the file */ fclose(fp); fp = NULL; /* Check that there are valid waypoints in memory */ if (nroutepoint < 1) { error = MB_ERROR_EOF; status = MB_FAILURE; fprintf(stderr,"\nNo line start or line end waypoints read from route file: <%s>\n",route_file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } else if (nroutepoint < 2) { error = MB_ERROR_EOF; status = MB_FAILURE; fprintf(stderr,"\nOnly one line start or line end waypoint read from route file: <%s>\n",route_file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* set starting values */ activewaypoint = 0; mb_coor_scale(verbose,routelat[activewaypoint], &mtodeglon, &mtodeglat); rangelast = 1000 * rangethreshold; /* output status */ if (verbose > 0) { /* output info on file output */ fprintf(stderr,"Read %d waypoints from route file: %s\n", nroutepoint, route_file); } /* get format if required */ if (format == 0) mb_get_format(verbose,read_file,NULL,&format,&error); /* determine whether to read one file or a list of files */ if (format < 0) read_datalist = MB_YES; /* open file list */ if (read_datalist == MB_YES) { if ((status = mb_datalist_open(verbose,&datalist, read_file,look_processed,&error)) != MB_SUCCESS) { error = MB_ERROR_OPEN_FAIL; fprintf(stderr,"\nUnable to open data list file: %s\n", read_file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } /* else copy single filename to be read */ else { strcpy(file, read_file); read_data = MB_YES; } /* loop over all files to be read */ while (read_data == MB_YES) { /* read fnv file if possible */ mb_get_fnv(verbose, file, &format, &error); /* initialize reading the swath file */ if ((status = mb_read_init( verbose,file,format,pings,lonflip,bounds, btime_i,etime_i,speedmin,timegap, &mbio_ptr,&btime_d,&etime_d, &beams_bath,&beams_amp,&pixels_ss,&error)) != MB_SUCCESS) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error returned from function <mb_read_init>:\n%s\n",message); fprintf(stderr,"\nMultibeam File <%s> not initialized for reading\n",file); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* allocate memory for data arrays */ if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(char), (void **)&beamflag, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bath, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_AMPLITUDE, sizeof(double), (void **)&, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_BATHYMETRY, sizeof(double), (void **)&bathalongtrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ss, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssacrosstrack, &error); if (error == MB_ERROR_NO_ERROR) status = mb_register_array(verbose, mbio_ptr, MB_MEM_TYPE_SIDESCAN, sizeof(double), (void **)&ssalongtrack, &error); /* if error initializing memory then quit */ if (error != MB_ERROR_NO_ERROR) { mb_error(verbose,error,&message); fprintf(stderr,"\nMBIO Error allocating data arrays:\n%s\n", message); fprintf(stderr,"\nProgram <%s> Terminated\n", program_name); exit(error); } /* read and use data */ nread = 0; while (error <= MB_ERROR_NO_ERROR && activewaypoint < nroutepoint) { /* reset error */ error = MB_ERROR_NO_ERROR; /* read next data record */ status = mb_get_all(verbose,mbio_ptr,&store_ptr,&kind, time_i,&time_d,&navlon,&navlat, &speed,&heading, &distance,&altitude,&sonardepth, &beams_bath,&beams_amp,&pixels_ss, beamflag,bath,amp,bathacrosstrack,bathalongtrack, ss,ssacrosstrack,ssalongtrack, comment,&error); /* deal with nav and time from survey data only - not nav, sidescan, or subbottom */ if (error <= MB_ERROR_NO_ERROR && kind == MB_DATA_DATA) { /* increment counter */ nread++; /* save last nav and heading */ if (navlon != 0.0) lastlon = navlon; if (navlat != 0.0) lastlat = navlat; if (heading != 0.0) lastheading = heading; if (time_d != 0.0) lasttime_d = time_d; /* check survey data position against waypoints */ if (navlon != 0.0 && navlat != 0.0) { dx = (navlon - routelon[activewaypoint]) / mtodeglon; dy = (navlat - routelat[activewaypoint]) / mtodeglat; range = sqrt(dx * dx + dy * dy); if (verbose > 0) fprintf(stderr,"> activewaypoint:%d time_d:%f range:%f lon: %f %f lat: %f %f\n", activewaypoint, time_d, range, navlon, routelon[activewaypoint], navlat, routelat[activewaypoint]); if (range < rangethreshold && (activewaypoint == 0 || range > rangelast) && activewaypoint < nroutepoint) { fprintf(stderr,"Waypoint %d of %d found with range %f m\n", activewaypoint, nroutepoint, range); routetime_d[activewaypoint] = time_d; activewaypoint++; nroutepointfound++; mb_coor_scale(verbose,routelat[activewaypoint], &mtodeglon, &mtodeglat); rangelast = 1000 * rangethreshold; } else rangelast = range; } } /* print debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Ping read in program <%s>\n", program_name); fprintf(stderr,"dbg2 kind: %d\n",kind); fprintf(stderr,"dbg2 error: %d\n",error); fprintf(stderr,"dbg2 status: %d\n",status); } } /* close the swath file */ status = mb_close(verbose,&mbio_ptr,&error); /* output read statistics */ fprintf(stderr,"%d records read from %s\n", nread, file); /* figure out whether and what to read next */ if (read_datalist == MB_YES) { if ((status = mb_datalist_read(verbose,datalist, file,&format,&file_weight,&error)) == MB_SUCCESS) read_data = MB_YES; else read_data = MB_NO; } else { read_data = MB_NO; } /* end loop over files in list */ } if (read_datalist == MB_YES) mb_datalist_close(verbose,&datalist,&error); /* if the last route point was not reached, add one last waypoint */ if (nroutepointfound < nroutepoint) { fprintf(stderr,"Waypoint %d of %d set at end of data with range %f m to next specified waypoint\n", activewaypoint, nroutepoint, range); routelon[nroutepointfound] = lastlon; routelat[nroutepointfound] = lastlat; routeheading[nroutepointfound] = lastheading; routetime_d[nroutepointfound] = lasttime_d; routewaypoint[nroutepointfound] = MBES_ROUTE_WAYPOINT_ENDLINE; nroutepointfound++; } /* output time list for the route */ if (output_file_set == MB_NO) { sprintf(output_file, "%s_wpttime_d.txt", read_file); } if ((fp = fopen(output_file, "w")) == NULL) { error = MB_ERROR_OPEN_FAIL; status = MB_FAILURE; fprintf(stderr,"\nUnable to open output waypoint time list file <%s> for writing\n",output_file); exit(status); } for (i=0;i<nroutepointfound;i++) { fprintf(fp,"%3d %3d %11.6f %10.6f %10.6f %.6f\n", i, routewaypoint[i], routelon[i], routelat[i], routeheading[i], routetime_d[i]); if (verbose > 0) fprintf(stderr,"%3d %3d %11.6f %10.6f %10.6f %.6f\n", i, routewaypoint[i], routelon[i], routelat[i], routeheading[i], routetime_d[i]); } fclose(fp); /* deallocate route arrays */ status = mb_freed(verbose,__FILE__,__LINE__, (void **)&routelon, &error); status = mb_freed(verbose,__FILE__,__LINE__, (void **)&routelat, &error); status = mb_freed(verbose,__FILE__,__LINE__, (void **)&routeheading, &error); status = mb_freed(verbose,__FILE__,__LINE__, (void **)&routewaypoint, &error); status = mb_freed(verbose,__FILE__,__LINE__, (void **)&routetime_d, &error); /* check memory */ if (verbose >= 4) status = mb_memory_list(verbose,&error); /* print output debug statements */ if (verbose >= 2) { fprintf(stderr,"\ndbg2 Program <%s> completed\n", program_name); fprintf(stderr,"dbg2 Ending status:\n"); fprintf(stderr,"dbg2 status: %d\n",status); } /* end it all */ exit(error); }