void simple( int argc, char* argv[] ) { AnyOption *opt = new AnyOption(); opt->noPOSIX(); /* use simpler option type */ opt->setOption( "width" ); opt->setOption( "height" ); opt->setFlag( "convert"); opt->setCommandOption( "name" ); opt->setFileOption( "title" ); if ( ! opt->processFile( "sample.txt" ) ) cout << "Failed processing the resource file" << endl ; opt->processCommandArgs( argc, argv ); cout << "THE OPTIONS : " << endl << endl ; if( opt->getValue( "width" ) != NULL ) cout << "width : " << opt->getValue( "width" ) << endl ; if( opt->getValue( "height" ) != NULL ) cout << "height : " << opt->getValue( "height" ) << endl ; if( opt->getValue( "name" ) != NULL ) cout << "name : " << opt->getValue( "name" ) << endl ; if( opt->getValue( "title" ) != NULL ) cout << "title : " << opt->getValue( "title" ) << endl ; if( opt->getFlag( "convert" ) ) cout << "convert : set " << endl ; cout << endl ; cout << "THE ARGUMENTS : " << endl << endl ; for( int i = 0 ; i < opt->getArgc() ; i++ ){ cout << opt->getArgv( i ) << endl ; } cout << endl; delete opt; }
AnyOption *parseInputOptions( int argc, char **argv ) { // parse input options AnyOption *opt = new AnyOption(); opt->addUsage( "Usage: " ); opt->addUsage( "" ); opt->addUsage( "The options below can be specified in a colon-separated file \"raytrace.2d.options\" or at the command line. Command-line options override file options." ); opt->addUsage( " --help -h Print this message and exit" ); //opt->addUsage( " --atmosout Output the atmosphere and all its derivatives to atmospheric_profile.out"); opt->addUsage( "" ); opt->addUsage( "To use an arbitrary 1-D atmospheric profile in ASCII format (space or comma-separated) the following options apply:" ); opt->addUsage( "REQUIRED (no default values):" ); opt->addUsage( " --atmosfile <filename> Uses an ASCII atmosphere file" ); opt->addUsage( " --atmosfileorder The order of the (z,t,u,v,w,p,d) fields in the ASCII file (Ex: 'ztuvpd')" ); opt->addUsage( " --elev Value in range (-90,90)" ); opt->addUsage( " --azimuth Value in range [0,360), clockwise from north" ); opt->addUsage( " --maxraylength Maximum ray length to calculate (km) [none]" ); opt->addUsage( "OPTIONAL [defaults]:" ); opt->addUsage( " --skiplines Lines at the beginning of the ASCII file to skip [0]" ); opt->addUsage( " --maxelev Maximum elevation angle to calculate [--elev value]" ); opt->addUsage( " --delev Elevation angle step [1]" ); opt->addUsage( " --maxazimuth Maximum azimuth to calculate [--azimuth value]" ); opt->addUsage( " --dazimuth Azimuth angle step [1]" ); opt->addUsage( " --sourceheight Height at which to begin raytrace [ground level]" ); opt->addUsage( " --maxheight Height at which to cut off calculation [150 km]" ); opt->addUsage( " --maxrange Maximum distance from origin to calculate (km) [no maximum]" ); opt->addUsage( " --stepsize Ray length step size for computation, km [0.01]" ); opt->addUsage( " --skips Maximum number of skips to allow. Use 0 for no limits. [0]" ); opt->addUsage( " --wind_units Specify 'kmpersec' if the winds are given in km/s [mpersec]" ); opt->addUsage( "FLAGS (no value required):" ); opt->addUsage( " --partial Report the final, incomplete raypath as well as the complete bounces." ); opt->addUsage( "" ); /* opt->addUsage( "To use a set of ASCII files that form a 2-D slice of the atmosphere the following options apply:" ); opt->addUsage( "REQUIRED (no default values):" ); opt->addUsage( " --slicefile <filename> The name of the summary file describing the path (see documentation)" ); opt->addUsage( " --elev Value in range (-90,90)" ); opt->addUsage( " --maxraylength Maximum ray length to calculate (km) [none]" ); opt->addUsage( "OPTIONAL [defaults]:" ); opt->addUsage( " --maxelev Maximum elevation angle to calculate [--elev value]" ); opt->addUsage( " --delev Elevation angle step [1]" ); opt->addUsage( " --maxazimuth Maximum azimuth to calculate [--azimuth value]" ); opt->addUsage( " --dazimuth Azimuth angle step [1]" ); opt->addUsage( " --sourceheight Height at which to begin raytrace [ground level]" ); opt->addUsage( " --maxheight Height at which to cut off calculation [150 km]" ); opt->addUsage( " --maxrange Maximum distance from origin to calculate (km) [no maximum]" ); opt->addUsage( " --stepsize Ray length step size for computation, km [0.01]" ); opt->addUsage( " --skips Maximum number of skips to allow. Use 0 for no limits. [0]" ); opt->addUsage( "FLAGS (no value required):" ); opt->addUsage( " --partial Report the final, incomplete raypath as well as the complete bounces." ); opt->addUsage( "" ); opt->addUsage( "To use an analytic profile with Gaussian wind jets the following options apply:" ); opt->addUsage( "REQUIRED (no default values):" ); opt->addUsage( " --jetfile <filename> The parameter file for the profile" ); opt->addUsage( " --elev Value in range (-90,90)" ); opt->addUsage( " --azimuth Value in range [0,360), clockwise from north (optional for --envfile)" ); opt->addUsage( " --maxraylength Maximum ray length to calculate (km) [none]" ); opt->addUsage( "OPTIONAL [defaults]:" ); opt->addUsage( " --maxelev Maximum elevation angle to calculate [--elev value]" ); opt->addUsage( " --delev Elevation angle step [1]" ); opt->addUsage( " --maxazimuth Maximum azimuth to calculate [--azimuth value]" ); opt->addUsage( " --dazimuth Azimuth angle step [1]" ); opt->addUsage( " --sourceheight Height at which to begin raytrace [ground level]" ); opt->addUsage( " --maxheight Height at which to cut off calculation [150 km]" ); opt->addUsage( " --maxrange Maximum distance from origin to calculate (km) [no maximum]" ); opt->addUsage( " --stepsize Ray length step size for computation, km [0.1]" ); opt->addUsage( " --skips Maximum number of skips to allow. Use 0 for no limits. [0]" ); opt->addUsage( "FLAGS (no value required):" ); opt->addUsage( " --partial Report the final, incomplete raypath as well as the complete bounces." ); */ opt->addUsage( "" ); opt->addUsage( "Examples (run from 'samples' directory):" ); opt->addUsage( "../bin/raytrace.2d --azimuth 90 --elev 1 --delev 1 --maxelev 45 --skips 1 --atmosfile NCPA_canonical_profile_zuvwtdp.dat --atmosfileorder zuvwtdp --maxraylength 800 --maxheight 140" ); opt->addUsage( "cat raypath_az090* > raypaths.2d.dat" ); opt->addUsage( "rm raypath_az090*" ); // Set up the actual flags and stuff opt->setFlag( "help", 'h' ); opt->setFlag( "norange" ); opt->setFlag( "atmosout" ); opt->setFlag( "partial" ); opt->setOption( "slicefile" ); opt->setOption( "atmosfile" ); opt->setOption( "jetfile" ); opt->setOption( "elev" ); opt->setOption( "azimuth" ); opt->setOption( "maxraylength" ); opt->setOption( "lat" ); opt->setOption( "lon" ); opt->setOption( "maxrange" ); opt->setOption( "maxelev" ); opt->setOption( "delev" ); opt->setOption( "maxazimuth" ); opt->setOption( "dazimuth" ); opt->setOption( "sourceheight" ); opt->setOption( "maxheight" ); opt->setOption( "stepsize" ); opt->setOption( "dZ" ); opt->setOption( "dR" ); opt->setOption( "atmosfileorder" ); opt->setOption( "skiplines" ); opt->setOption( "skips" ); opt->setOption( "wind_units" ); // Process the command-line arguments opt->processFile( "./raytrace.2d.options" ); opt->processCommandArgs( argc, argv ); if( ! opt->hasOptions()) { // print usage if no options opt->printUsage(); delete opt; exit( 1 ); } // Check to see if help text was requested if ( opt->getFlag( "help" ) || opt->getFlag( 'h' ) ) { opt->printUsage(); exit( 1 ); } return opt; }
void detailed( int argc, char* argv[] ) { /* 1. CREATE AN OBJECT */ AnyOption *opt = new AnyOption(); /* 2. SET PREFERENCES */ //opt->noPOSIX(); /* do not check for POSIX style character options */ //opt->setVerbose(); /* print warnings about unknown options */ //opt->noUsage(); /* stop printing Usage */ /* 3. SET THE USAGE/HELP */ opt->addUsage( "Usage: foo [OPTIONS]... [IMAGE FOLDER] " ); opt->addUsage( "Unknown options/arguments encountered " ); opt->addUsage( "Use -h or --help for a complete list of options" ); /* 4. SET THE OPTION STRINGS/CHARACTERS */ opt->setFlag( "help", 'h' ); /* for help */ opt->setOption( "width", 'w' ); opt->setOption( "height" ); opt->setFlag( "convert"); opt->setCommandOption( "name", 'n' ); opt->setCommandFlag( "help" ); opt->setFileOption( "title" ); /* 5. PROVIDE THE COMMANDLINE AND RESOURCE FILE */ if ( ! opt->processFile( "sample.txt" ) ) cout << "Failed processing the resource file" << endl ; opt->processCommandArgs( argc, argv ); /* 6. GET THE VALUES */ /* help */ if( opt->getFlag( "help" ) || opt->getFlag( 'h' ) ){ opt->printUsage(); /* print help here */ } cout << "THE OPTIONS : " << endl << endl ; if( opt->getValue( 'w' ) != NULL ) cout << "w : " << opt->getValue( 'w' ) << endl ; if( opt->getValue( "width" ) != NULL ) cout << "width : " << opt->getValue( "width" ) << endl ; if( opt->getValue( "height" ) != NULL ) cout << "height : " << opt->getValue( "height" ) << endl ; if( opt->getValue( "name" ) != NULL ) cout << "name : " << opt->getValue( "name" ) << endl ; if( opt->getValue( 'n' ) != NULL ) cout << "n : " << opt->getValue( 'n' ) << endl ; if( opt->getValue( "title" ) != NULL ) cout << "title : " << opt->getValue( "title" ) << endl ; if( opt->getFlag( "convert" ) ) cout << "convert : set " << endl ; cout << endl ; /* 7. GET THE ACTUAL ARGUMNETS AFTER THE OPTIONS */ cout << "THE ARGUMENTS : " << endl << endl ; for( int i = 0 ; i < opt->getArgc() ; i++ ){ cout << opt->getArgv( i ) << endl ; } cout << endl; /* 7. DONE */ delete opt; }
// // Function to parse the input options (both command lines and in the options file ModessRD.options) // AnyOption *parseInputOptions( int argc, char **argv ) { // parse input options AnyOption *opt = new AnyOption(); opt->addUsage( "----------------------------------------------------------------------------" ); opt->addUsage( "| NCPA Infrasound |" ); opt->addUsage( "| Normal Modes for Range-Dependent Environments |" ); opt->addUsage( "| Two-Way Coupled Mode Solution |" ); opt->addUsage( "| Single Frequency: Effective Sound Speed Approximation |" ); opt->addUsage( "----------------------------------------------------------------------------" ); opt->addUsage( "Usage: " ); opt->addUsage( "By default the program computes the 1D transmission loss (TL)" ); opt->addUsage( "at the ground or the specified receiver height and saves the data to 2 files:" ); opt->addUsage( " file tloss_rd2wcm_1d.nm - considering attenuation in the atmosphere" ); opt->addUsage( " file tloss_rd2wcm_1d.lossless.nm - no attenuation" ); opt->addUsage( "Additionally, if the flag --write_2D_TLoss is present on the command line the 2D TL is saved to file tloss_rd_2d.nm" ); opt->addUsage( "The options below can be specified in a colon-separated file \"Modess.options\" or at the command line. Command-line options override file options." ); opt->addUsage( " --help -h Print this message and exit" ); opt->addUsage( "" ); opt->addUsage( " The atmosphere can be specified from one of 2 different sources:"); opt->addUsage( " 1. An .env file containing the atmospheric specifications at certain ranges:" ); opt->addUsage( " use option --g2senvfile <filename>" ); opt->addUsage( " 2. Several ASCII files stored in a given directory:" ); opt->addUsage( " use option --use_1D_profiles_from_dir <mydirname>" ); //opt->addUsage( "The program requires an .env file containing the atmospheric specifications at certain ranges" ); opt->addUsage( "The following options apply:" ); opt->addUsage( "" ); opt->addUsage( "REQUIRED (no default values):" ); //opt->addUsage( " --atmosfile <filename> Uses an ASCII atmosphere file" ); opt->addUsage( " --g2senvfile <filename> Uses an .env binary file containing multiple 1D profiles" ); opt->addUsage( " --atmosfileorder The order of the (z,t,u,v,w,p,d) fields in the ASCII file (Ex: 'ztuvpd')" ); opt->addUsage( " --skiplines Lines at the beginning of the ASCII file to skip" ); opt->addUsage( " --azimuth Degrees in range [0,360), clockwise from North" ); opt->addUsage( " --freq Frequency [Hz]" ); opt->addUsage( "" ); opt->addUsage( "OPTIONAL [defaults]:" ); opt->addUsage( " --maxheight_km Calculation grid height in km above MSL [150 km]" ); opt->addUsage( " --zground_km Height of the ground level above MSL [0 km]" ); opt->addUsage( " --Nz_grid Number of points on the z-grid from ground to maxheight [20000]" ); opt->addUsage( " --sourceheight_km Source height in km Above Ground Level (AGL) [0]" ); opt->addUsage( " --receiverheight_km Receiver height in km AGL [0]" ); opt->addUsage( " --maxrange_km Maximum horizontal distance from origin to propagate [1000 km]" ); opt->addUsage( " --Nrng_steps Number of range steps to propagate [1000]" ); opt->addUsage( " --ground_impedance_model Name of the ground impedance models to be employed:" ); opt->addUsage( " [rigid], others TBD" ); opt->addUsage( " --Lamb_wave_BC If ==1 it sets admittance = -1/2*dln(rho)/dz; [ 0 ]" ); opt->addUsage( " --wind_units Use it to specify 'kmpersec' if the winds are given in km/s [mpersec]" ); opt->addUsage( " --use_attn_file Use it to specify a file name containing user-provided" ); opt->addUsage( " attenuation coefficients to be loaded instead of " ); opt->addUsage( " the default Sutherland-Bass attenuation. " ); opt->addUsage( " The text file should contain two columns: " ); opt->addUsage( " height (km AGL) and " ); opt->addUsage( " attenuation coefficients in np/m." ); opt->addUsage( "" ); opt->addUsage( " --use_profile_ranges_km" ); opt->addUsage( " e.g. --use_profile_ranges_km 0_20_50_80.5_300 " ); opt->addUsage( " The profiles at certain ranges specified by numbers" ); opt->addUsage( " (in km) in a string such as 0_20_50_80.5_300 are"); opt->addUsage( " requested in the propagation. Note that underscores" ); opt->addUsage( " are necessary to separate the numbers." ); opt->addUsage( " Note also that these are requested ranges;" ); opt->addUsage( " however the left-closest profile available" ); opt->addUsage( " in the .env file will actually be used; " ); opt->addUsage( " for instance we request the profile at 300 km " ); opt->addUsage( " but in the .env file the left-closest profile" ); opt->addUsage( " may be available at 290 km and it is the one used." ); opt->addUsage( " Example: >> ../bin/ModessRD2WCM --atmosfile g2sgcp2011012606L.jordan.env "); opt->addUsage( " --atmosfileorder zuvwtdp --azimuth 90 --freq 0.01 "); opt->addUsage( " --use_profiles_ranges_km 100_200_250 --maxrange_km 500 "); opt->addUsage( "" ); opt->addUsage( " --use_profiles_at_steps_km" ); opt->addUsage( " e.g. --use_profiles_at_steps_km 100" ); opt->addUsage( " The profiles are requested at equidistant intervals " ); opt->addUsage( " specified by this option [1000]" ); opt->addUsage( "" ); opt->addUsage( " --use_1D_profiles_from_dir" ); opt->addUsage( " e.g. --use_1D_profiles_from_dir myprofiles" ); opt->addUsage( " This option allows to use the ascii profiles stored in" ); opt->addUsage( " the specified directory. The profiles must have names" ); opt->addUsage( " 'profiles0001', 'profiles0002', etc. and will be" ); opt->addUsage( " used in alphabetical order at the provided ranges" ); opt->addUsage( " e.g. in conjunction with either" ); opt->addUsage( " option '--use_profile_ranges_km' " ); opt->addUsage( " or option '--use_profiles_at_steps_km'" ); opt->addUsage( " If there are more requested ranges than existing" ); opt->addUsage( " profiles then the last profile is used repeatedly" ); opt->addUsage( " as necessary." ); opt->addUsage( " Example: >> ../bin/ModessRD2WCM --atmosfileorder zuvwtdp --skiplines 1" ); opt->addUsage( " --azimuth 90 --freq 0.1 --use_1D_profiles_from_dir myprofiles" ); opt->addUsage( " --use_profile_ranges_km 0_100_300_500 " ); opt->addUsage( "" ); opt->addUsage( "FLAGS (no value required):" ); opt->addUsage( " --write_2D_TLoss Outputs the 2D transmission loss to" ); opt->addUsage( " default file: tloss_rd2wcm_2d.nm" ); opt->addUsage( "" ); opt->addUsage( "" ); opt->addUsage( " The format of the output files are as follows (column order):" ); opt->addUsage( " tloss_rd2wcm_1d.nm: r, 4*PI*Re(P), 4*PI*Im(P), (incoherent TL)" ); opt->addUsage( " tloss_rd2wcm_1d.lossless.nm:" ); opt->addUsage( " tloss_rd2wcm_2d.nm: r, z, 4*PI*Re(P), 4*PI*Im(P)" ); opt->addUsage( "" ); opt->addUsage( " Examples to run (in the 'samples' directory):" ); opt->addUsage( "" ); opt->addUsage( " ../bin/ModessRD2WCM --use_1D_profiles_from_dir profiles --atmosfileorder zuvwtdp --skiplines 1 --azimuth 90 --freq 0.1 --use_profile_ranges_km 0_100_200_300 --maxrange_km 500" ); opt->addUsage( "" ); opt->addUsage( " ../bin/ModessRD2WCM --g2senvfile g2sgcp2011012606L.jordan.env --atmosfileorder zuvwtdp --skiplines 1 --azimuth 90 --freq 0.1 --use_profile_ranges_km 0_100_200_250 --maxrange_km 500" ); opt->addUsage( "" ); opt->addUsage( " ../bin/ModessRD2WCM --use_1D_profiles_from_dir profiles --atmosfileorder zuvwtdp --skiplines 1 --azimuth 90 --freq 0.1 --maxrange_km 500" ); opt->addUsage( "" ); opt->addUsage( " Note: if options --use_profile_ranges_km/--use_profiles_at_steps_km are not used then we fall back on the range-independent case using the first available atm. profile." ); opt->addUsage( "" ); // Set up the actual flags, etc. opt->setFlag( "help", 'h' ); opt->setFlag( "write_2D_TLoss" ); opt->setFlag( "plot" ); opt->setOption( "atmosfile" ); opt->setOption( "atmosfileorder" ); opt->setOption( "g2senvfile" ); opt->setOption( "wind_units" ); opt->setOption( "use_1D_profiles_from_dir" ); opt->setOption( "slicefile" ); opt->setOption( "skiplines" ); opt->setOption( "azimuth" ); opt->setOption( "freq" ); opt->setOption( "maxrange_km" ); opt->setOption( "sourceheight_km" ); opt->setOption( "receiverheight_km" ); opt->setOption( "maxheight_km" ); opt->setOption( "zground_km" ); opt->setOption( "stepsize" ); opt->setOption( "Nz_grid" ); opt->setOption( "Nrng_steps" ); opt->setOption( "ground_impedance_model" ); opt->setOption( "Lamb_wave_BC" ); opt->setOption( "use_profile_ranges_km" ); opt->setOption( "use_profiles_at_steps_km" ); opt->setOption( "use_attn_file" ); // Process the command-line arguments opt->processFile( "./ModessRD2WCM.options" ); opt->processCommandArgs( argc, argv ); if( ! opt->hasOptions()) { // print usage if no options opt->printUsage(); delete opt; exit( 1 ); } // Check to see if help text was requested if ( opt->getFlag( "help" ) || opt->getFlag( 'h' ) ) { opt->printUsage(); exit( 1 ); } return opt; }
AnyOption *parseInputOptions( int argc, char **argv ) { // parse input options AnyOption *opt = new AnyOption(); opt->addUsage( "----------------------------------------------------------------------------" ); opt->addUsage( "| NCPA Infrasound |" ); opt->addUsage( "| Normal Modes Broadband |" ); opt->addUsage( "| Based on either: Effective Sound Speed Approximation - see ModESS |" ); opt->addUsage( "| Wide_Angle High-Mach code - see WMod |" ); opt->addUsage( "----------------------------------------------------------------------------" ); opt->addUsage( "Usage: " ); opt->addUsage( "" ); opt->addUsage( "The options below can be specified in a colon-separated file \"ModBB.options\""); opt->addUsage( "or at the command line. Command-line options override file options." ); opt->addUsage( "Be sure to precede all options with two minuses (--)." ); opt->addUsage( " --help -h Print this message and exit" ); opt->addUsage( "" ); opt->addUsage( "One of two algorithms can be used to perform pulse propagation." ); opt->addUsage( "The first is based on the Effective Sound Speed Approximation (as in ModESS);" ); opt->addUsage( "the second is based on the the Wide_Angle High-Mach solution "); opt->addUsage( "of the wave equation (see implementation in WMod)." ); opt->addUsage( "ModESS is faster but it is accurate for (launch) angles less than 30 deg and" ); opt->addUsage( "low wind speeds. WMod extends the validity to higher angles" ); opt->addUsage( "and high Mach numbers but it runs slower." ); opt->addUsage( "Options --use_modess and --use_wmod allow the user to choose"); opt->addUsage( "the desired algorithm when computing the dispersion data (see step 1 below)." ); opt->addUsage( "" ); opt->addUsage( "To propagate a pulse, 2 steps must be completed:"); opt->addUsage( " 1. A dispersion file must be available or computed" ); opt->addUsage( " using the option --out_disp_src2rcv_file ." ); // opt->addUsage( " use either option --out_dispersion_files or --out_disp_src2rcv_file" ); opt->addUsage( " 2. Perform pulse propagation for one of several scenarios:"); opt->addUsage( " a. source-to-receiver at one range (option --pulse_prop_src2rcv)"); opt->addUsage( " b. source-to-receiver at several equally spaced ranges " ); opt->addUsage( " (option --pulse_prop_src2rcv_grid)"); // opt->addUsage( " c. computing the whole 2D pressure field " ); // opt->addUsage( " (most expensive - option --pulse_prop_grid)" ); opt->addUsage( " The source type can be one of the following:" ); opt->addUsage( " delta function -> see option --get_impulse_resp" ); opt->addUsage( " built-in pulse choice 1 -> see option --use_builtin_pulse1" ); opt->addUsage( " built-in pulse choice 2 -> see option --use_builtin_pulse2" ); opt->addUsage( " user-provided spectrum file -> see option --src_spectrum_file" ); opt->addUsage( " user-provided waveform file -> see option --src_waveform_file" ); opt->addUsage( "" ); // opt->addUsage( "To compute a dispersion file: one of the following 2 options is REQUIRED:" ); opt->addUsage( "To compute a dispersion file: the following option is REQUIRED:" ); opt->addUsage( " --out_disp_src2rcv_file <dispersion filename>"); opt->addUsage( " Output dispersion curves and modal values for" ); opt->addUsage( " source-to-receiver propagation to the specified file." ); // opt->addUsage( " --out_dispersion_files <dispersion filename stub>"); // opt->addUsage( " Output dispersion curves and modal values on a 2D grid" ); // opt->addUsage( " to binary files at each frequency. The resulting filenames" ); // opt->addUsage( " have the stub and frequency appended: " ); // opt->addUsage( " e.g. <stub><freq>_nm.bin." ); // opt->addUsage( " This option is computationally expensive." ); opt->addUsage( "" ); // opt->addUsage( " Examples (run in the 'samples' directory):" ); // opt->addUsage( "" ); // opt->addUsage( " a. Compute dispersion file that will be used to compute the pressure pulse at 1 receiver. Assume that we want to end up with a pulse having a spectrum with a maximum frequency of f_max=0.5 Hz. Also assume that we want the pulse represented on a time record of T=512 seconds. The number of positive frequencies necessary for the calculation is T*f_max = 256 i.e.256 frequencies between 0 and 0.5 Hz. Thus we know f_max=0.5 Hz and f_step=f_max/256=0.001953125 Hz. The corresponding run command is:" ); opt->addUsage( " Example (run in the 'samples' directory):" ); opt->addUsage( "" ); opt->addUsage( " Example to obtain a dispersion file that will be used to compute" ); opt->addUsage( " the propagated pressure pulse at a distant receiver. " ); opt->addUsage( " Assume that we want to end up with a pulse having a spectrum" ); opt->addUsage( " with a maximum frequency of f_max=0.5 Hz. " ); opt->addUsage( " Also assume that we want the pulse represented on a time record " ); opt->addUsage( " of T=512 seconds. The number of positive frequencies necessary " ); opt->addUsage( " for the calculation is T*f_max = 256 i.e.256 frequencies " ); opt->addUsage( " between f_min=f_step and 0.5 Hz. The step in frequency is " ); opt->addUsage( " f_step=f_max/256=0.001953125 Hz." ); opt->addUsage( " The corresponding run command is:" ); opt->addUsage( "" ); opt->addUsage( " >> ../bin/ModBB --out_disp_src2rcv_file myDispersionFile.dat " ); opt->addUsage( " --atmosfile NCPA_canonical_profile_zuvwtdp.dat --atmosfileorder zuvwtdp " ); opt->addUsage( " --skiplines 0 --azimuth 90 --f_step 0.001953125 --f_max 0.5 --use_modess" ); opt->addUsage( "" ); opt->addUsage( " Each line in this dispersion file has (4 + 4*n_modes) entries" ); opt->addUsage( " in the following format:" ); opt->addUsage( " freq n_modes rho_src rho_rcv Re(k_pert_m) Im(k_pert_m) V_m(z_src) V_m(z_rcv)" ); opt->addUsage( " where m varies from 1 to n_modes. k_pert_m, and V_m are" ); opt->addUsage( " the m_th wavenumber and mode amplitude respectively." ); opt->addUsage( " z_src and z_rcv stand for source and receiver height respectively." ); opt->addUsage( "" ); // opt->addUsage( " b. Compute dispersion files for propagation to all receivers on a 2D grid: for 256 frequencies from 0 to 0.5 Hz in steps of 0.5/256 Hz:" ); // opt->addUsage( "" ); // opt->addUsage( " >> ../bin/ModBB --out_dispersion_files disprs --atmosfile NCPA_canonical_profile_zuvwtdp.dat --atmosfileorder zuvwtdp --skiplines 0 --azimuth 90 --f_step 0.001953125 --f_max 0.5 --use_modess" ); opt->addUsage( "" ); opt->addUsage( "In addition the following options are REQUIRED:" ); opt->addUsage( " --use_modess Prompts the use of ModESS algorithm." ); opt->addUsage( " --use_wmod Prompts the use of WMod algorithm." ); opt->addUsage( " Note that --use_modess and --use_wmod are mutually exclusive." ); opt->addUsage( " --atmosfile <filename> Uses an ASCII atmosphere file" ); opt->addUsage( " referenced to Mean Sea Level (MSL)." ); opt->addUsage( " --atmosfileorder The order of the (z,t,u,v,w,p,d) fields in " ); opt->addUsage( " the ASCII file (Ex: 'ztuvpd')" ); opt->addUsage( " --skiplines Lines at the beginning of the ASCII file to skip" ); opt->addUsage( " --azimuth Value in range [0,360), clockwise from North" ); opt->addUsage( " --f_step The frequency step" ); opt->addUsage( " --f_max Maximum frequency to propagate" ); opt->addUsage( " Note that in this case the array of frequencies is [f_step:f_step:f_max]." ); opt->addUsage( "" ); opt->addUsage( "OPTIONAL [defaults]:" ); opt->addUsage( " --f_min Minimum frequency [f_step Hz] " ); opt->addUsage( " --maxheight_km Calculation grid height in km above MSL [150 km]" ); opt->addUsage( " --zground_km Height of the ground level above MSL [0 km]" ); opt->addUsage( " --Nz_grid Number of points on the z-grid from the ground" ); opt->addUsage( " to maxheight [20000]" ); opt->addUsage( " --sourceheight_km Source height in km Above Ground Level (AGL) [0]" ); opt->addUsage( " --receiverheight_km Receiver height in km AGL [0]" ); opt->addUsage( " --maxrange_km Maximum horizontal distance from origin to propagate" ); opt->addUsage( " [1000 km]" ); opt->addUsage( " --ground_impedance_model Name of the ground impedance models to be employed:" ); opt->addUsage( " [rigid], TBD" ); opt->addUsage( " --Lamb_wave_BC For a rigid ground: if ==1 it sets" ); opt->addUsage( " admittance= = -1/2*dln(rho)/dz; [ 0 ]" ); opt->addUsage( " --wind_units Use it to specify 'kmpersec' if the winds are given" ); opt->addUsage( " in km/s [ mpersec ]" ); opt->addUsage( " --use_attn_file Option to specify a file name containing" ); opt->addUsage( " user-provided attenuation coefficients " ); opt->addUsage( " to be loaded instead of the default" ); opt->addUsage( " Sutherland-Bass attenuation. " ); opt->addUsage( " The text file should contain two columns: " ); opt->addUsage( " height (km AGL) and " ); opt->addUsage( " attenuation coefficients in np/m." ); opt->addUsage( " --c_min Specify the minimum phase speed (in m/sec)." ); opt->addUsage( " This is used in conjunction with the --wvnum_filter" ); opt->addUsage( " flag which turns on wavenumber filtering by" ); opt->addUsage( " phase speed. See also the --wvnum_filter flag" ); opt->addUsage( " and the --c_max option." ); opt->addUsage( " --c_max Specify the maximum phase speed (in m/sec)." ); opt->addUsage( "" ); opt->addUsage( "FLAGS (no value required after the flag itself):" ); opt->addUsage( " --turnoff_WKB Turn off the WKB least phase speed estimation," ); opt->addUsage( " an approximation that speeds-up ground-to-ground" ); opt->addUsage( " propagation. If either or both the source and " ); opt->addUsage( " receiver are not on the ground [height=0] " ); opt->addUsage( " the approximation is turned off by default" ); opt->addUsage( " regardless whether the flag is mentioned" ); opt->addUsage( " in the command line or not." ); opt->addUsage( " --use_zero_attn Set attenuation to zero."); opt->addUsage( " Reads the dispersion file and sets the"); opt->addUsage( " imaginary part of the wavenumber to zero."); opt->addUsage( " --wvnum_filter Applies wavenumber filtering by phase speed" ); opt->addUsage( " and should be followed by specification of" ); opt->addUsage( " the parameters:" ); opt->addUsage( " --c_min minimum phase speed (in m/sec)." ); opt->addUsage( " --c_max maximum phase speed (in m/sec)." ); opt->addUsage( "" ); opt->addUsage( "" ); opt->addUsage( "Options for PULSE PROPAGATION:" ); opt->addUsage( " --pulse_prop_src2rcv <dispersion filename> "); opt->addUsage( " Propagate pulse from source to 1 receiver"); opt->addUsage( " at a distance specified by option --range_R_km; " ); opt->addUsage( " --range_R_km Propagate pulse to this range [km]" ); opt->addUsage( " --waveform_out_file <waveform filename> Name of the waveform output file" ); opt->addUsage( "" ); opt->addUsage( " --pulse_prop_src2rcv_grid <dispersion filename> "); opt->addUsage( " Propagate pulse from source to array of "); opt->addUsage( " horizontally equally-spaced receivers" ); opt->addUsage( "" ); opt->addUsage( " REQUIRED additional options:" ); opt->addUsage( " --f_center The center frequency of the built-in pulse choices 1 and 2" ); opt->addUsage( " (f_center<=f_max/5)" ); opt->addUsage( " --R_start_km Propagation from this range to R_end_km in DR_km steps." ); opt->addUsage( " --R_end_km Pulse is propagated from R_start_km to this range." ); opt->addUsage( " --DR_km Range step to propagate from R_start_km to R_end_km." ); opt->addUsage( " --waveform_out_file <waveform filename> "); opt->addUsage( " Name of the waveform output file." ); opt->addUsage( "" ); opt->addUsage( " OPTIONAL [defaults]:" ); opt->addUsage( " --max_celerity Maximum celerity [340 m/s]." ); opt->addUsage( " --nfft Number of points used in the FFT computation. "); opt->addUsage( " Defaults to [4*f_max/f_step]." ); opt->addUsage( "" ); opt->addUsage( "" ); opt->addUsage( "SOURCE TYPE input options: Use one of the following 4 options" ); opt->addUsage( " to specify the source type:" ); opt->addUsage( " --get_impulse_resp Flag to use a delta function as source and" ); opt->addUsage( " to output the impulse response." ); opt->addUsage( " --use_builtin_pulse1 Flag to request the use of the built-in source pulse." ); opt->addUsage( " Note: Use --f_center to request the central frequency" ); opt->addUsage( " of the pulse. f_center is restricted to a maximum" ); opt->addUsage( " value of fmax/5 where fmax is the maximum frequency" ); opt->addUsage( " defined by the dispersion file." ); opt->addUsage( " The input waveform and spectrum are also saved for the" ); opt->addUsage( " user's reference such that:" ); opt->addUsage( " The built-in source spectrum is outputted in the file." ); opt->addUsage( " 'source_spectrum_input.dat' with the format." ); opt->addUsage( " | Freq (Hz) | Re(S) | Imag(S) |." ); opt->addUsage( " The input source waveform is outputted in the file." ); opt->addUsage( " 'source_waveform_input.dat' with the format." ); opt->addUsage( " | Time [s] | Amplitude |." ); opt->addUsage( " --use_builtin_pulse2 Flag to request a second shape of built-in source pulse." ); opt->addUsage( " The input waveform and spectrum are also saved for the" ); opt->addUsage( " user's reference such that:" ); opt->addUsage( " The built-in source spectrum is outputted in the file." ); opt->addUsage( " 'source_spectrum_input.dat' with the format." ); opt->addUsage( " | Freq (Hz) | Re(S) | Imag(S) |." ); opt->addUsage( " The input source waveform is outputted in the file." ); opt->addUsage( " 'source_waveform_input.dat' with the format." ); opt->addUsage( " | Time [s] | Amplitude |." ); opt->addUsage( " --src_spectrum_file Specify the file name of the source spectrum"); opt->addUsage( " at positive frequencies. The file must have 3 columns" ); opt->addUsage( " | Freq | Real(Spectrum) | Imag(Spectrum) |" ); opt->addUsage( " Note that the frequencies provided in the file" ); opt->addUsage( " must match the frequencies in the dispersion file." ); opt->addUsage( " --src_waveform_file Specify the file name of the user-provided " ); opt->addUsage( " source waveform. The file must have 2 columns" ); opt->addUsage( " |Time | Amplitude |" ); opt->addUsage( " If none of then source type options are specified the delta function source"); opt->addUsage( " is the default i.e. the output is the impulse response." ); opt->addUsage( "" ); opt->addUsage( " Example: Pulse propagation to a point on the ground at range_R_km" ); opt->addUsage( " and output the impulse response:" ); opt->addUsage( "" ); opt->addUsage( " ../bin/ModBB --pulse_prop_src2rcv myDispersionFile.dat --range_R_km 240 " ); opt->addUsage( " --waveform_out_file mywavf.dat --get_impulse_resp" ); opt->addUsage( "" ); opt->addUsage( " Example: Pulse propagation to a point on the ground at range_R_km" ); opt->addUsage( " and employ the user-provided source spectrum:" ); opt->addUsage( "" ); opt->addUsage( " ../bin/ModBB --pulse_prop_src2rcv myDispersionFile.dat --range_R_km 240 " ); opt->addUsage( " --waveform_out_file mywavf.dat --max_celerity 300 " ); opt->addUsage( " --src_spectrum_file source_spectrum_example.dat" ); opt->addUsage( "" ); opt->addUsage( " Example: Pulse propagation to several points on the ground 20 km apart" ); opt->addUsage( " and employ the user-provided source waveform:" ); opt->addUsage( "" ); opt->addUsage( " ../bin/ModBB --pulse_prop_src2rcv_grid myDispersionFile.dat " ); opt->addUsage( " --R_start_km 240 --DR_km 20 --R_end_km 300 --waveform_out_file mywavf.dat " ); opt->addUsage( " --src_waveform_file source_waveform_input_example.dat" ); opt->addUsage( "" ); opt->addUsage( "" ); /* // This functionality works but was disabled because of too long computation times. opt->addUsage( " To compute a 2D field:" ); opt->addUsage( " --pulse_prop_grid <dispersion directory name> "); opt->addUsage( " Compute/view pulse on the 2D spatial x-z grid of 'height_km'"); opt->addUsage( " and 'width_km' starting at 'R_start_km" ); opt->addUsage( "" ); opt->addUsage( " --------------------------------------------------------------" ); opt->addUsage( " height_km | |" ); opt->addUsage( " | Pressure field computed within |" ); opt->addUsage( " | a 2D (width_km x height_km) grid |" ); opt->addUsage( " | 'ntsteps' times |" ); opt->addUsage( " | every 'tmstep' seconds |" ); opt->addUsage( " | |" ); opt->addUsage( " | |" ); opt->addUsage( " -------------x------------------------------------------------" ); opt->addUsage( " R_start_km" ); opt->addUsage( "" ); opt->addUsage(" Additional parameters:" ); opt->addUsage( " --R_start_km The grid (viewing window) starts at R_start_km" ); opt->addUsage( " --width_km Grid width" ); opt->addUsage( " --max_celerity Reference speed [m/s]; in conjunction with R_start_km"); opt->addUsage( " it is determining where inside the grid the field is at"); opt->addUsage( " a time step; a value smaller than the speed of sound"); opt->addUsage( " at the ground is suggested." ); opt->addUsage( " --tmstep 2D pressure field is calculated at this specified time step." ); opt->addUsage( " --ntsteps Number of times the 2D pressure field is calculated"); opt->addUsage( " 'tmstep' seconds apart." ); opt->addUsage( "" ); opt->addUsage( " OPTIONAL [defaults]:" ); opt->addUsage( " --height_km The height of the 2D grid. [maximum height]" ); opt->addUsage( " --frame_file_stub Each 2D grid is saved into a file with the name"); opt->addUsage( " frame_file_stub_<time_of_start>; Default:[Pressure2D]." ); opt->addUsage( "" ); opt->addUsage( " Example: >> ../bin/ModBB --pulse_prop_grid mydispersionFolder --R_start_km 220 --width_km 50 --height_km 25 --max_celerity 300 --tmstep 30 --ntsteps 5 --frame_file_stub myPressure --use_builtin_pulse" ); opt->addUsage( "" ); */ // Set up the actual flags, etc. opt->setFlag( "help", 'h' ); opt->setFlag( "use_modess" ); opt->setFlag( "use_wmod" ); opt->setFlag( "get_impulse_resp" ); opt->setFlag( "use_builtin_pulse1" ); opt->setFlag( "use_builtin_pulse2" ); opt->setFlag( "turnoff_WKB"); opt->setFlag( "plot"); opt->setFlag( "use_zero_attn"); opt->setFlag( "wvnum_filter"); opt->setOption( "atmosfile" ); opt->setOption( "atmosfileorder" ); opt->setOption( "wind_units" ); opt->setOption( "skiplines" ); opt->setOption( "azimuth" ); opt->setOption( "maxrange_km" ); opt->setOption( "sourceheight_km" ); opt->setOption( "receiverheight_km" ); opt->setOption( "maxheight_km" ); opt->setOption( "zground_km" ); opt->setOption( "stepsize" ); opt->setOption( "Nz_grid" ); opt->setOption( "Nrng_steps" ); opt->setOption( "out_TL_2D" ); opt->setOption( "ground_impedance_model" ); opt->setOption( "Lamb_wave_BC" ); opt->setOption( "f_min" ); opt->setOption( "f_step" ); opt->setOption( "f_max" ); opt->setOption( "f_center" ); opt->setOption( "pulse_prop_grid" ); opt->setOption( "pulse_prop_src2rcv" ); opt->setOption( "pulse_prop_src2rcv_grid" ); opt->setOption( "R_start_km" ); opt->setOption( "R_end_km" ); opt->setOption( "DR_km" ); opt->setOption( "max_celerity" ); opt->setOption( "range_R_km" ); opt->setOption( "out_dispersion_files" ); opt->setOption( "out_disp_src2rcv_file" ); opt->setOption( "waveform_out_file" ); opt->setOption( "width_km" ); opt->setOption( "height_km" ); opt->setOption( "tmstep" ); opt->setOption( "ntsteps" ); opt->setOption( "frame_file_stub" ); opt->setOption( "disp_dirname" ); opt->setOption( "src_spectrum_file" ); opt->setOption( "src_waveform_file" ); opt->setOption( "nfft" ); opt->setOption( "use_attn_file" ); opt->setOption( "c_min" ); opt->setOption( "c_max" ); // Process the command-line arguments opt->processFile( "./ModBB.options" ); opt->processCommandArgs( argc, argv ); if( ! opt->hasOptions()) { // print usage if no options opt->printUsage(); delete opt; exit( 1 ); } // Check to see if help text was requested if ( opt->getFlag( "help" ) || opt->getFlag( 'h' ) ) { opt->printUsage(); exit( 1 ); } return opt; }