// ------------------------------------------------------------- // PETScConfigurable::p_unprocessOptions // ------------------------------------------------------------- void PETScConfigurable::p_unprocessOptions(void) { boost::char_separator<char> sep(" \t\f\n\r\v", ""); boost::tokenizer<boost::char_separator<char> > opttok(p_loadedOptions, sep); boost::tokenizer<boost::char_separator<char> >::iterator o; for (o = opttok.begin(); o != opttok.end(); ++o) { if ((*o)[0] == '-' && islower((*o)[1])) { PetscErrorCode ierr(0); try { if (verbose) { std::cout << "p_unprocessOptions: removing \"" << *o << "\"" << std::endl; } ierr = PetscOptionsClearValue( #if PETSC_VERSION_GE(3,7,0) NULL, #endif o->c_str()); } catch (const PETSC_EXCEPTION_TYPE& e) { throw PETScException(ierr, e); } } } p_loadedOptions.clear(); }
size_t parse_command_line(int argc, const char* argv[], info_t* out_info, filter_chain::filter_t* out_filters, size_t max_filters) { size_t nfilters = 0; info_t info; info.random_seed = timer::now_msi(); const char* value = nullptr; char ch = opttok(&value, argc, argv, s_cmdline_opts); while (ch) { int ivalue = atoi(value); switch (ch) { case 'i': case 'e': { if (out_filters && nfilters < max_filters) { out_filters[nfilters].regex = value; out_filters[nfilters].type = ch == 'i' ? filter_chain::inclusion::include1 : filter_chain::inclusion::exclude1; } nfilters++; break; } case 'r': info.random_seed = atoi(value); break; case 'n': info.num_iterations = atoi(value); break; case '_': info.enable_leak_tracking = false; break; case 'c': info.capture_leak_callstack = true; break; case '!': info.break_on_alloc = ivalue; break; case 't': info.terminate_other_processes = false; break; default: break; } ch = opttok(&value); } if (out_info) *out_info = info; return nfilters; }
/** * * * @param comm * @param props * * @return PETSc options prefix to use */ void PETScConfigurable::p_processOptions(utility::Configuration::CursorPtr props) { if (!props) return; p_prefix = props->get(p_prefixKey, p_generatePrefix(p_comm)); if (*p_prefix.rbegin() != '_') { p_prefix.append("_"); } std::string optsorig, optsmod, optsfmt; optsorig = props->get(p_optionsKey, ""); boost::char_separator<char> sep(" \t\f\n\r\v", ""); boost::tokenizer<boost::char_separator<char> > opttok(optsorig, sep); boost::tokenizer<boost::char_separator<char> >::iterator o; for (o = opttok.begin(); o != opttok.end(); ++o) { optsfmt.append(*o); optsfmt.append(" "); optsmod.append(prefixOptionMaybe(p_prefix, *o)); optsmod.append(" "); } if (verbose) { std::cout << "p_processOptions: in: " << optsorig << std::endl; std::cout << "p_processOptions: fmt: " << optsfmt << std::endl; std::cout << "p_processOptions: out: " << optsmod << std::endl; } p_loadedOptions = optsmod; PetscErrorCode ierr(0); try { ierr = PetscOptionsInsertString( #if PETSC_VERSION_GE(3,7,0) NULL, #endif p_loadedOptions.c_str()); CHKERRXX(ierr); } catch (const PETSC_EXCEPTION_TYPE& e) { throw PETScException(ierr, e); } return; }