void *t_fun(void *arg) { struct s *s; s = get_s(); pthread_mutex_lock(&s->mutex); s->datum = 5; // NORACE pthread_mutex_lock(&s->mutex); return NULL; }
int get_s(int u, int f) { int r = 1; for (int i = h[u]; i != -1; i = nxt[i]) { int v = to[i]; if (!vis[v] && v != f) r += get_s(v, u); } return r; }
Timer::Caller Timer::call( const Function& func , double interval , bool repeat ) { // push function without paused time TimeFunc*tf = new TimeFunc( get_s()-mms_to_s(paused_time_mms)+interval, repeat?interval:0, func); to_call.push(tf); return Caller(&(tf->state)); }
/* SETUP ROUTINES */ int initial_set(){ int prompt,status; #ifdef FIX_NODE_GEOM int i; #endif /* On node zero, read lattice size and send to others */ if(mynode()==0){ /* print banner */ printf("SU3 clover valence fermions\n"); printf("MIMD version 7 $Name: $\n"); printf("Machine = %s, with %d nodes\n",machine_type(),numnodes()); time_stamp("start"); status = get_prompt(stdin, &prompt ); IF_OK status += get_i(stdin,prompt,"nx", ¶m.nx ); IF_OK status += get_i(stdin,prompt,"ny", ¶m.ny ); IF_OK status += get_i(stdin,prompt,"nz", ¶m.nz ); IF_OK status += get_i(stdin,prompt,"nt", ¶m.nt ); #ifdef FIX_NODE_GEOM IF_OK status += get_vi(stdin, prompt, "node_geometry", param.node_geometry, 4); #ifdef FIX_IONODE_GEOM IF_OK status += get_vi(stdin, prompt, "ionode_geometry", param.ionode_geometry, 4); #endif #endif IF_OK status += get_s(stdin, prompt,"job_id",param.job_id); if(status>0) param.stopflag=1; else param.stopflag=0; } /* end if(mynode()==0) */ /* Node 0 broadcasts parameter buffer to all other nodes */ broadcast_bytes((char *)¶m,sizeof(param)); if( param.stopflag != 0 ) normal_exit(0); nx=param.nx; ny=param.ny; nz=param.nz; nt=param.nt; #ifdef FIX_NODE_GEOM for(i = 0; i < 4; i++) node_geometry[i] = param.node_geometry[i]; #ifdef FIX_IONODE_GEOM for(i = 0; i < 4; i++) ionode_geometry[i] = param.ionode_geometry[i]; #endif #endif this_node = mynode(); number_of_nodes = numnodes(); volume=nx*ny*nz*nt; return(prompt); }
/*! * \brief 指定した連想配列群に静的APIを追加する * \param[in] line 行番号 * \param[in] arg_list マクロ実引数リスト * \param[in] p_ctx マクロコンテキスト * \retval マクロ返却値 * API.で始まる連想配列群を、必要に応じて適切に変換を行った上で、別のプレフィックスで始まる * 連想配列群に追加する。想定する使用方法としては、特定のソフトウェア部品で理解可能な静的API * に関しては、追加を行わないか、他の静的APIに置き換えて追加を行う。理解できない静的APIに関して * はそのまま追加を行う。 * この関数の第一引数にはAPI.で始まる連想配列の連番を、第二引数には追加先に連想配列群の * プレフィックスを、第三引数には対象とする静的API名を、第四引数には追加するパラメータシンボルの * 並びを、第五引数にはパラメータの並びを指定する。 */ var_t bf_addapi( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx ) { element e; if ( macro_processor::check_arity( line, arg_list.size(), 5, "ADDAPI" ) ) { itronx::factory* factory = get_global< itronx::factory* >( "factory" ); std::map< std::string, itronx::static_api::info > const* info_map = factory->get_static_api_info_map(); std::tr1::int64_t order = get_i( arg_list[ 0 ], p_ctx ); // 元の静的APIの連番 std::string list_name = get_s( arg_list[ 1 ], p_ctx ); // 出力先リストの識別名 std::string api_name = get_s( arg_list[ 2 ], p_ctx ); // 静的API名 var_t params = arg_list[ 3 ]; // パラメータシンボルの並び var_t args = arg_list[ 4 ]; // パラメータの並び std::map< std::string, itronx::static_api::info >::const_iterator it = info_map->find( api_name ); if ( it != info_map->end() ) { itronx::static_api::info info = it->second; std::string str_order = boost::lexical_cast< std::string >( order ); p_ctx->var_map[ list_name + ".TEXT_LINE[" + str_order + "]" ] = p_ctx->var_map[ "API.TEXT_LINE[" + str_order + "]" ]; e.s = api_name; p_ctx->var_map[ list_name + ".NAME[" + str_order + "]" ] = var_t( 1, e ); e.s = info.type; p_ctx->var_map[ list_name + ".TYPE[" + str_order + "]" ] = var_t( 1, e ); p_ctx->var_map[ list_name + ".PARAMS[" + str_order + "]" ] = params; p_ctx->var_map[ list_name + ".ARGS[" + str_order + "]" ] = args; e.s.clear(); if ( !p_ctx->var_map[ list_name + ".ORDER_LIST" ].empty() ) { e.i = *p_ctx->var_map[ list_name + ".ORDER_LIST" ].back().i + 1; } else { e.i = 1; } p_ctx->var_map[ list_name + ".ORDER_LIST" ].push_back( e ); e.s.clear(); e.i = 1; } } return var_t( 1, e ); }
/*! * \brief テキストの翻訳 * \param[in] line 行番号 * \param[in] arg_list マクロ実引数リスト * \param[in] p_ctx マクロコンテキスト * \retval マクロ返却値 * 第1マクロ実引数で指定した文字列を翻訳する。 */ var_t bf_gettext( text_line const& line, std::vector< var_t > const& arg_list, context const* p_ctx ) { element e; if ( macro_processor::check_arity( line, arg_list.size(), 1, "GETTEXT" ) ) { std::string message = get_s( arg_list[0], p_ctx ); e.s = gettext( message ); } return var_t( 1, e ); }
/*! * \brief 変数のトレース * \param[in] line 行番号 * \param[in] arg_list マクロ実引数リスト * \param[in] p_ctx マクロコンテキスト * \retval マクロ返却値 * 第1マクロ実引数で指定した変数の内容をトレースする。 * 第2マクロ実引数を指定した場合、その文字列属性で指定したファイルにトレース内容を追記する。 * ファイル名として、"stdout"を指定した場合は標準出力、"stderr"を指定した場合は標準エラーに出力する。 * ファイル名を省略した場合は"stderr"を指定したものとして振舞う。 */ var_t bf_trace( text_line const& line, std::vector< var_t > const& arg_list, context const* p_ctx ) { std::size_t arity = arg_list.size(); if ( arity < 1 ) { error( line, _( "too few arguments for `%1%\'" ), "TRACE" ); } else if ( arity > 2 ) { error( line, _( "too many arguments for `%1%\'" ), "TRACE" ); } var_t value( arg_list[ 0 ] ); std::string trace_str = "{ "; for ( var_t::const_iterator iter( value.begin() ), last( value.end() ); iter != last; ++iter ) { trace_str += "\"" + iter->s + "\"("; if ( iter->i ) // 値属性があれば... { trace_str += boost::lexical_cast< std::string >( *iter->i ); } trace_str += "), "; } trace_str += " }\n"; std::string filename( "stderr" ); if ( arity == 2 ) { filename = get_s( arg_list[ 1 ], p_ctx ); } if ( filename == "stdout" ) { fputs( trace_str.c_str(), stdout ); } else if ( filename == "stderr" ) { fputs( trace_str.c_str(), stderr ); } else { std::FILE* stream = std::fopen( filename.c_str(), "a" ); if ( stream != 0 ) { fputs( trace_str.c_str(), stream ); std::fclose( stream ); } } element e; return var_t( 1, e ); }
/* read in parameters and coupling constants */ int readin(int prompt) { /* read in parameters for su3 monte carlo */ /* argument "prompt" is 1 if prompts are to be given for input */ int status, jflav; /* On node zero, read parameters and send to all other nodes */ if(this_node==0){ printf("\n\n"); status=0; IF_OK status += get_i(stdin, prompt, "number_of_random_sources", ¶m.nrand); if(param.nrand < 2){ fprintf(stderr, "ERROR: need more than 1 random source to compute correlations\n"); status++; } IF_OK status += get_i(stdin, prompt, "number_of_flavors", ¶m.nflav); for(jflav = 0; jflav < param.nflav; jflav++){ IF_OK status += get_f(stdin, prompt, "charge", ¶m.charges[jflav]); IF_OK status += get_s(stdin, prompt, "file", param.fname[jflav]); } IF_OK status += get_s(stdin, prompt, "save_corr", param.corrfile); /* End of input fields */ if( status > 0)param.stopflag=1; else param.stopflag=0; } /* end if(this_node==0) */ broadcast_bytes((char *)¶m,sizeof(param)); if( param.stopflag != 0 )return param.stopflag; if(prompt==2)return 0; } /* setup.c */
static char char_at(obj* self, va_list* args) { int i = va_arg(*args, int); if (i < 0) { LOG_CRITICAL("Attempt to access index %d of string with length %d", i, get_d(self, "length")); abort(); } else if (i >= get_d(self, "length")) { LOG_CRITICAL("Attempt to access index %d of string with length %d", i, get_d(self, "length")); abort(); } return get_s(self, "value")[i]; }
/* --------------------------------------------------------------- */ void R_sqlopen( const int func ) { const char *filename; if (ARGN!=1) Lerror(ERR_INCORRECT_CALL,0); get_s(1); LASCIIZ(*ARG1); filename = LSTR(*ARG1); if (sqldb!=NULL) sqlite3_close(sqldb); Licpy(ARGR, sqlite3_open(LSTR(*ARG1), &sqldb)); sqlstmt = NULL; } /* R_sqliteopen */
int randr_init() { Rect r; int i = 0, n = 0; char *ptr, *output, *str = NULL; /* try to put presentation on the first available specified output: */ if (get_s(videoOut)) { str = strdup(get_s(videoOut)); output = strtok_r(str, ", ", &ptr); n = _screen_info(output, 0, &r); while ( !(r.w && r.h) && (output=strtok_r(NULL, ", ", &ptr)) ) _screen_info(output, 0, &r); } /* if that failed, get the first available output: */ else { n = _screen_info(NULL, i = 1, &r); while (!(r.w && r.h) && (++i) < n) _screen_info(NULL, i, &r); } /* if no output can be found, return 1, otherwise set pres variables */ if (!(r.w && r.h)) { if (str) free(str); return 1; } set(presX, r.x); set(presY, r.y); set(presW, r.w); set(presH, r.h); /* try to put notes on the next available specified output: */ r.x = r.y = r.w = r.h = 0; if (str && output) { while ( !(r.w && r.h) && (output=strtok_r(NULL, ", ", &ptr)) ) _screen_info(output, 0, &r); free(str); } /* if that failed, get the next available output (if any): */ while (!(r.w && r.h) && (++i) < n) _screen_info(NULL, i, &r); if (!(r.w && r.h)) return 0; set(noteX, r.x); set(noteY, r.y); return 0; }
int main () { int *d; struct s *s; pthread_t id; pthread_mutex_t *m; s = get_s(); m = &s->mutex; d = &s->datum; pthread_create(&id,NULL,t_fun,NULL); *d = 8; //RACE return 0; }
void dfs(int u) { int s = get_s(u, -1); t = INF, d = u; get_d(u, -1, s); //fprintf(stderr, "%d %d\n", u, d); calc(d); vis[d] = 1; for (int i = h[d]; i != -1; i = nxt[i]) { int v = to[i]; if (!vis[v]) dfs(v); } }
/*! * \brief 値の生成 * \param[in] line 行番号 * \param[in] arg_list マクロ実引数リスト * \param[in] p_ctx マクロコンテキスト * \retval マクロ返却値 * 第1マクロ実引数をテキスト、第2マクロ実引数を数値として、値を生成する。 */ var_t bf_value( text_line const& line, std::vector< var_t > const& arg_list, context const* p_ctx ) { element e; if ( macro_processor::check_arity( line, arg_list.size(), 2, "VALUE" ) ) { if ( !arg_list[0].empty() ) { e.s = get_s( arg_list[0], p_ctx ); } if ( !arg_list[1].empty() ) { e.i = get_i( arg_list[1], p_ctx ); } } return var_t( 1, e ); }
/*! * \brief マクロ実引数の書式化 * \param[in] line 行番号 * \param[in] arg_list マクロ実引数リスト * \param[in] p_ctx マクロコンテキスト * \retval マクロ返却値 * 第1マクロ実引数で指定した初期化文字列によって、第2マクロ実引数以降を書式化する。 * 書式化文字列は、%nが使えないことを除き、printf関数のスーパーセットである。 * 正確な仕様は、boost::formatを参照のこと。 */ var_t bf_format( text_line const& line, std::vector< var_t > const& arg_list, context const* p_ctx ) { element e; std::size_t arity = arg_list.size(); if ( arity < 1 ) { error( line, _( "too few arguments for `%1%\'" ), "FORMAT" ); } boost::format fmt( get_s( arg_list[0], p_ctx ) ); for ( std::size_t i = 1; i < arity; i++ ) { std::pair< var_t const*, context const* > arg( &arg_list[i], p_ctx ); fmt % arg; } e.s = fmt.str(); return var_t( 1, e ); }
int t11(){ int x, *q; char *y, *w; struct s z; struct s *a, *b; q = &a->i; y = a->cp; z.i = 8; *(get_s()) = a; assert(q == &a->i); // ??? assert(y == a->cp); // UNKNOWN assert(z.i == 8); return 0; }
int main () { int *d, *l; struct s *s; pthread_t id; pthread_mutex_t *m; s = get_s(); m = &s->mutex; d = &s->data; pthread_create(&id,NULL,t_fun,NULL); pthread_mutex_lock(m); *d = 8; // RACE pthread_mutex_unlock(m); return 0; }
int xlib_init() { scr = DefaultScreen(dpy); root = DefaultRootWindow(dpy); #ifdef module_randr randr_init(); #else set(presX, 0); set(presY, 0); set(presW, DisplayWidth(dpy,scr)); set(presH, DisplayHeight(dpy,scr)); #endif /* moudle_randr */ XSetWindowAttributes wa; wa.background_pixel = 0x000000; wa.backing_store = Always; wa.event_mask = ButtonPressMask | KeyPressMask | PointerMotionMask; topWin = XCreateWindow(dpy, root, get_d(presX), get_d(presY), get_d(presW), get_d(presH), 0, DefaultDepth(dpy,scr), InputOutput, DefaultVisual(dpy,scr), CWBackPixel | CWBackingStore | CWEventMask, &wa); presWin = XCreateWindow(dpy, topWin, 0, 0, get_d(presW), get_d(presH), 0, DefaultDepth(dpy,scr), InputOutput, DefaultVisual(dpy,scr), CWBackingStore | CWEventMask, &wa); XClassHint hint; hint.res_name = "Presentation"; hint.res_class = "Slider"; XSetClassHint(dpy, topWin, &hint); XStoreName(dpy, topWin, "Slider"); XMapWindow(dpy, topWin); // TODO where is it? XMapWindow(dpy, presWin); /* override placement of annoying WMs */ XMoveWindow(dpy, topWin, get_d(presX), get_d(presY)); /* other init functions */ if (command_init()) return xlib_free(1); if (render_init(get_s(presFile))) return xlib_free(2); // render_init(get_s(noteFile)); #ifdef module_cursor if (cursor_init(presWin)) return xlib_free(3); #endif #ifdef module_sorter if (sorter_init(topWin)) return xlib_free(4); #endif render_set_fader(presWin, 1); command(cmdFullscreen, NULL); return 0; }
/*! * \brief 変数群の交換 * \param[in] line 行番号 * \param[in] arg_list マクロ実引数リスト * \param[in] p_ctx マクロコンテキスト * \retval マクロ返却値 * 第一引数で指定したプレフィックスで始まる変数群を削除する。’SWAPPREFIX’関数で交換したあと、 * 不要になった変数群はこの関数で削除しておくことが望ましい。 */ var_t bf_cleanvars( text_line const& line, std::vector< var_t > const& arg_list, context* p_ctx ) { if ( macro_processor::check_arity( line, arg_list.size(), 1, "CLEANVARS" ) ) { std::string prefix = get_s( arg_list[ 0 ], p_ctx ) + "."; // 変数の接頭辞 std::size_t n = prefix.size(); std::map< std::string, var_t > temp_map; for ( std::map< std::string, var_t >::const_iterator iter = p_ctx->var_map.begin(), last =p_ctx->var_map.end(); iter != last; ++iter ) { if ( std::strncmp( iter->first.c_str(), prefix.c_str(), n ) != 0 ) { temp_map.insert( *iter ); } } p_ctx->var_map.swap( temp_map ); } return var_t(); }
/* SETUP ROUTINES */ int initial_set(){ int prompt,status; /* On node zero, read lattice size, seed, and send to others */ if(mynode()==0){ /* print banner */ printf("Heavy-light spectroscpy with Kogut-Susskind light fermions\n"); printf("MIMD version 7\n"); printf("Machine = %s, with %d nodes\n",machine_type(),numnodes()); time_stamp("start"); status = get_prompt(stdin, &prompt ); IF_OK status += get_i(stdin, prompt,"nx", &par_buf.nx ); IF_OK status += get_i(stdin, prompt,"ny", &par_buf.ny ); IF_OK status += get_i(stdin, prompt,"nz", &par_buf.nz ); IF_OK status += get_i(stdin, prompt,"nt", &par_buf.nt ); IF_OK status += get_s(stdin, prompt,"job_id",par_buf.job_id); if(status>0) par_buf.stopflag=1; else par_buf.stopflag=0; } /* end if(mynode()==0) */ /* Node 0 broadcasts parameter buffer to all other nodes */ broadcast_bytes((char *)&par_buf,sizeof(par_buf)); if( par_buf.stopflag != 0 ) normal_exit(0); nx=par_buf.nx; ny=par_buf.ny; nz=par_buf.nz; nt=par_buf.nt; strcpy(job_id,par_buf.job_id); this_node = mynode(); number_of_nodes = numnodes(); volume=nx*ny*nz*nt; total_iters=0; return(prompt); }
/*! * \brief 順序リストの整列 * \param[in] line 行番号 * \param[in] arg_list マクロ実引数リスト * \param[in] p_ctx マクロコンテキスト * \retval マクロ返却値 * 第1マクロ実引数として与えた順序付きリストの各要素を、第2マクロ実引数の添え字とした場合の変数を評価し、 * その評価結果に基づき昇順に整列する。 * * \example * $FOO[1] = 20$ * $FOO[2] = 10$ * $FOO[3] = 30$ * $SORT({ 1,2,3 }, "FOO")$ * → { 2,1,3 } * \endexample */ var_t bf_sort( text_line const& line, std::vector< var_t > const& arg_list, context const* p_ctx ) { var_t result; if ( macro_processor::check_arity( line, arg_list.size(), 2, "SORT" ) ) { var_t list( arg_list[0] ); std::string field( get_s( arg_list[1], p_ctx ) ); std::vector< std::pair< element, std::tr1::int64_t > > temp; for ( var_t::const_iterator iter( list.begin() ), last( list.end() ); iter != last; ++iter ) { std::tr1::int64_t order = iter->i.get(); std::string name( ( boost::format( "%s[%d]" ) % field % order ).str() ); std::map< std::string, var_t >::const_iterator m_iter( p_ctx->var_map.find( name ) ); if ( m_iter == p_ctx->var_map.end() ) { return var_t(); } if ( !m_iter->second.empty() ) { temp.push_back( std::make_pair( m_iter->second.front(), order ) ); } } std::stable_sort( temp.begin(), temp.end() ); for ( std::vector< std::pair< element, std::tr1::int64_t > >::const_iterator iter( temp.begin() ), last( temp.end() ); iter != last; ++iter ) { element e; e.i = iter->second; result.push_back( e ); } } return result; }
void append(obj* self, va_list* args) { char* part_two = va_arg(*args, char*); char* part_one = get_s(self, "value"); char* joined; int part_one_length = strlen(part_one); int part_two_length = strlen(part_two); int capacity = get_d(self, "capacity"); if (part_one_length + part_two_length + 1 > capacity) { int new_capacity = (capacity * 2) + part_two_length + 1; joined = calloc(new_capacity, sizeof(char)); assert(joined); strncpy(joined, part_one, part_one_length); set_d(self, "capacity", new_capacity); } strncat(joined, part_two, part_two_length); set_s(self, "value", joined); set_d(self, "length", part_one_length + part_two_length); free(joined); }
/* Since we are operating in binary mode, the return value from control * is irrelevant, as long as it is not negative. */ static int control(ErlDrvData drv_data, unsigned int command, char *buf, int len, char **rbuf, int rlen) { int r; char* s; s = get_s(buf, len); switch (command) { case DRV_CONNECT: r = do_connect(s, (our_data_t*)drv_data); break; case DRV_DISCONNECT: r = do_disconnect((our_data_t*)drv_data); break; case DRV_SELECT: r = do_select(s, (our_data_t*)drv_data); break; default: r = -1; break; } free_s(s); return r; }
/*! * \brief 環境変数の取得 * \param[in] line 行番号 * \param[in] arg_list マクロ実引数リスト * \param[in] p_ctx マクロコンテキスト * \retval マクロ返却値 * 第1マクロ実引数で指定した環境変数の値を返す。 */ var_t bf_environ( text_line const& line, std::vector< var_t > const& arg_list, context const* p_ctx ) { element e; if ( macro_processor::check_arity( line, arg_list.size(), 1, "ENVIRON" ) ) { std::string name = get_s( arg_list[0], p_ctx ); char const* env = std::getenv( name.c_str() ); if ( env == 0 ) { return var_t(); } e.s = env; errno = 0; char* endptr; if ( std::tr1::int64_t value = std::strtol( env, &endptr, 0 ) ) { if ( *endptr == '\0' && errno == 0 ) { e.i = value; } } } return var_t( 1, e ); }
damgard_jurik_ciphertext_t* damgard_jurik::encrypt(damgard_jurik_plaintext_t* pt) { return encrypt(pt, get_s(pt)); }
/* read in parameters and coupling constants */ int readin(int prompt) { /* read in parameters for su3 monte carlo */ /* argument "prompt" is 1 if prompts are to be given for input */ int i, status, current_index; #ifdef CHECK_INVERT char invert_string[16]; #endif /* On node zero, read parameters and send to all other nodes */ if(this_node==0) { printf("\n\n"); status=0; /* find out what kind of starting lattice to use */ IF_OK status += ask_starting_lattice(stdin, prompt, &(par_buf.startflag), par_buf.startfile ); IF_OK status += get_f(stdin, prompt,"u0", &par_buf.u0 ); /* find out what to do with lattice at end */ IF_OK status += ask_ending_lattice(stdin, prompt, &(par_buf.saveflag), par_buf.savefile ); IF_OK status += ask_ildg_LFN(stdin, prompt, par_buf.saveflag, par_buf.stringLFN ); /* find out what to do with longlinks at end */ IF_OK status += ask_ending_lattice(stdin, prompt, &(par_buf.savelongflag), par_buf.savelongfile ); /* find out what to do with fatlinks at end */ IF_OK status += ask_ending_lattice(stdin, prompt, &(par_buf.savefatflag), par_buf.savefatfile ); /* Inversion parameters */ IF_OK status += get_i(stdin, prompt,"number_of_masses", &par_buf.nmass ); /* maximum no. of conjugate gradient iterations */ IF_OK status += get_i(stdin, prompt,"max_cg_iterations", &par_buf.qic[0].max ); /* maximum no. of conjugate gradient restarts */ IF_OK status += get_i(stdin, prompt,"max_cg_restarts", &par_buf.qic[0].nrestart ); /* find out what kind of color vector source to use */ #ifdef CHECK_INVERT IF_OK status += ask_color_vector( prompt, &(par_buf.srcflag[0]), par_buf.srcfile[0] ); #endif IF_OK for(i = 0; i < par_buf.nmass; i++){ #ifndef CHECK_INVERT IF_OK status += ask_color_vector( prompt, &(par_buf.srcflag[i]), par_buf.srcfile[i] ); IF_OK if(par_buf.srcflag[i] != par_buf.srcflag[0]){ node0_printf("Must reload all or save all alike."); status++; } #endif IF_OK status += get_f(stdin, prompt,"mass", &par_buf.ksp[i].mass ); #if FERM_ACTION == HISQ || FERM_ACTION == HYPISQ IF_OK status += get_f(stdin, prompt, "naik_term_epsilon", &par_buf.ksp[i].naik_term_epsilon); IF_OK { if(i == 0){ if(par_buf.ksp[i].naik_term_epsilon != 0.0){ node0_printf("First Naik term epsilon must be zero."); status++; } } else { if(par_buf.ksp[i].naik_term_epsilon > par_buf.ksp[i-1].naik_term_epsilon){ node0_printf("Naik term epsilons must be in descending order."); status++; } } } #else par_buf.ksp[i].naik_term_epsilon = 0.0; #endif par_buf.qic[i].min = 0; par_buf.qic[i].start_flag = 0; par_buf.qic[i].nsrc = 1; par_buf.qic[i].max = par_buf.qic[0].max; par_buf.qic[i].nrestart = par_buf.qic[0].nrestart; par_buf.qic[i].prec = PRECISION; par_buf.qic[i].parity = EVENANDODD; /* error for propagator conjugate gradient */ IF_OK status += get_f(stdin, prompt, "error_for_propagator", &par_buf.qic[i].resid); IF_OK status += get_f(stdin, prompt, "rel_error_for_propagator", &par_buf.qic[i].relresid ); #ifdef CHECK_INVERT /* find out what kind of color vector result to use */ IF_OK status += ask_color_vector( prompt, &(par_buf.ansflag[i]), par_buf.ansfile[i] ); IF_OK if(par_buf.ansflag[i] != par_buf.ansflag[0]){ node0_printf("Must reload all or save all alike."); status++; } #endif } #ifndef CHECK_INVERT /* find out what kind of color matrix momentum to use */ IF_OK status += ask_color_matrix( prompt, &(par_buf.ansflag[0]), par_buf.ansfile[0] ); #endif #ifdef CHECK_INVERT /* find out which inversion to check */ IF_OK status += get_s(stdin, prompt, "invert", invert_string); if(status == 0){ if(strcmp(invert_string,"M")==0) par_buf.inverttype = INVERT_M; else if(strcmp(invert_string,"MdaggerM")==0) par_buf.inverttype = INVERT_MdaggerM; else{ printf("Unrecognized invert string %s\n",invert_string); status++; } } #endif if( status > 0)par_buf.stopflag=1; else par_buf.stopflag=0; } /* end if(this_node==0) */
/* SETUP ROUTINES */ static int initial_set(void){ int prompt,status; #ifdef FIX_NODE_GEOM int i; #endif /* On node zero, read lattice size and send to others */ if(mynode()==0){ /* print banner */ printf("Radial correlator code\n"); printf("MIMD version %s\n",MILC_CODE_VERSION); printf("Machine = %s, with %d nodes\n",machine_type(),numnodes()); gethostname(hostname, 128); printf("Host(0) = %s\n",hostname); printf("Username = %s\n", getenv("USER")); time_stamp("start"); get_utc_datetime(utc_date_time); status = get_prompt(stdin, &prompt ); IF_OK status += get_i(stdin,prompt,"nx", ¶m.nx ); IF_OK status += get_i(stdin,prompt,"ny", ¶m.ny ); IF_OK status += get_i(stdin,prompt,"nz", ¶m.nz ); IF_OK status += get_i(stdin,prompt,"nt", ¶m.nt ); #ifdef FIX_NODE_GEOM IF_OK status += get_vi(stdin, prompt, "node_geometry", param.node_geometry, 4); #ifdef FIX_IONODE_GEOM IF_OK status += get_vi(stdin, prompt, "ionode_geometry", param.ionode_geometry, 4); #endif #endif IF_OK status += get_s(stdin, prompt,"job_id",param.job_id); if(status>0) param.stopflag=1; else param.stopflag=0; } /* end if(mynode()==0) */ /* Node 0 broadcasts parameter buffer to all other nodes */ broadcast_bytes((char *)¶m,sizeof(param)); if( param.stopflag != 0 ) normal_exit(0); if(prompt==2)return prompt; nx=param.nx; ny=param.ny; nz=param.nz; nt=param.nt; #ifdef FIX_NODE_GEOM for(i = 0; i < 4; i++) node_geometry[i] = param.node_geometry[i]; #ifdef FIX_IONODE_GEOM for(i = 0; i < 4; i++) ionode_geometry[i] = param.ionode_geometry[i]; #endif #endif this_node = mynode(); number_of_nodes = numnodes(); volume=nx*ny*nz*nt; return(prompt); }
int readin(int prompt) { /* argument "prompt" is 1 if prompts are to be given for input */ int status,i; /* On node zero, read parameters and send to all other nodes */ if(this_node==0){ status=0; /* find out what kind of starting lattice to use */ IF_OK status += ask_starting_lattice(stdin, prompt, &(par_buf.startflag), par_buf.startfile ); /* find out what to do with lattice at end */ IF_OK status += ask_ending_lattice(stdin, prompt, &(par_buf.saveflag), par_buf.savefile ); IF_OK status += ask_ildg_LFN(stdin, prompt, par_buf.saveflag, par_buf.stringLFN ); /* Get ensemble values for NERSC archive */ IF_OK if (par_buf.saveflag == SAVE_SERIAL_ARCHIVE) status += get_s(stdin, prompt,"ensemble_id", par_buf.ensemble_id ); IF_OK if (par_buf.saveflag == SAVE_SERIAL_ARCHIVE) status += get_i(stdin, prompt,"sequence_number", &par_buf.sequence_number ); /* Number of kappas */ IF_OK status += get_i(stdin, prompt,"number_of_kappas", &par_buf.num_kap ); if( par_buf.num_kap>MAX_KAP ){ printf("num_kap = %d must be <= %d!\n", par_buf.num_kap, MAX_KAP); status++; } /* To be safe initialize the following to zero */ for(i=0;i<MAX_KAP;i++){ kap[i] = 0.0; } for(i=0;i<par_buf.num_kap;i++){ IF_OK status += ask_starting_wprop(stdin, prompt, &par_buf.startflag_w[i], par_buf.startfile_w[i]); /* Save the string to create the FNAL file name */ IF_OK status += get_s(stdin, prompt,"kappa", par_buf.kap_label[i] ); IF_OK par_buf.kap[i] = atof(par_buf.kap_label[i]); IF_OK status += get_s(stdin, prompt,"source_label", par_buf.src_label_w[i] ); IF_OK status += get_f(stdin, prompt,"d1", &par_buf.d1[i] ); } IF_OK status += get_i(stdin, prompt,"number_of_smearings", &par_buf.num_smear ); /* We always have a point sink */ par_buf.num_smear++; strcpy(par_buf.sink_label[0],"d"); par_buf.smearfile[0][0] = '\0'; for(i=1;i<par_buf.num_smear;i++){ IF_OK status += get_s(stdin, prompt,"sink_label", par_buf.sink_label[i] ); IF_OK status += get_s(stdin, prompt,"smear_func_file", par_buf.smearfile[i]); } IF_OK status += ask_starting_ksprop (stdin, prompt, &par_buf.ks_prop_startflag, par_buf.start_ks_prop_file); IF_OK status += get_s(stdin, prompt,"mass", par_buf.mass_label ); IF_OK par_buf.mass = atof(par_buf.mass_label); /* What file for the resulting correlators? */ IF_OK status += ask_corr_file( stdin, prompt, &par_buf.saveflag_c, par_buf.savefile_c); IF_OK status += get_i(stdin, prompt, "log_correlators", &par_buf.log_correlators); if( status > 0)par_buf.stopflag=1; else par_buf.stopflag=0; } /* end if(this_node==0) */
/* read in parameters and coupling constants */ int readin(int prompt) { /* read in parameters for su3 monte carlo */ /* argument "prompt" is 1 if prompts are to be given for input */ int status; int i, k, npbp_masses; #ifdef PRTIME double dtime; #endif STARTTIME; /* On node zero, read parameters and send to all other nodes */ if(this_node==0){ printf("\n\n"); status=0; /*------------------------------------------------------------*/ /* Gauge configuration section */ /*------------------------------------------------------------*/ IF_OK status += ask_starting_lattice(stdin, prompt, ¶m.startflag, param.startfile ); IF_OK status += get_f(stdin, prompt,"u0", ¶m.u0 ); /* find out what to do with lattice at end */ IF_OK status += ask_ending_lattice(stdin, prompt, &(param.saveflag), param.savefile ); IF_OK status += ask_ildg_LFN(stdin, prompt, param.saveflag, param.stringLFN ); /* Provision is made to build covariant sources from smeared links */ /* APE smearing parameters (if needed) */ /* Zero suppresses APE smearing */ IF_OK status += get_f(stdin, prompt, "staple_weight", ¶m.staple_weight); IF_OK status += get_i(stdin, prompt, "ape_iter", ¶m.ape_iter); #if EIGMODE == EIGCG /* for eigcg */ /* restart for Lanczos */ IF_OK status += get_i(stdin, prompt,"restart_lanczos", ¶m.eigcgp.m); /* number of eigenvectors per inversion */ IF_OK status += get_i(stdin, prompt,"Number_of_eigenvals", ¶m.eigcgp.Nvecs); if(param.eigcgp.m <= 2*param.eigcgp.Nvecs){ printf("restart_lanczos should be larger than 2*Number_of_eigenvals!\n"); status++; } /* maximum number of eigenvectors */ IF_OK status += get_i(stdin, prompt,"Max_Number_of_eigenvals", ¶m.eigcgp.Nvecs_max); /* eigenvector input */ IF_OK status += ask_starting_ks_eigen(stdin, prompt, ¶m.ks_eigen_startflag, param.ks_eigen_startfile); /* eigenvector output */ IF_OK status += ask_ending_ks_eigen(stdin, prompt, ¶m.ks_eigen_saveflag, param.ks_eigen_savefile); param.eigcgp.Nvecs_curr = 0; param.eigcgp.H = NULL; #endif #if EIGMODE == DEFLATION /*------------------------------------------------------------*/ /* Dirac eigenpair calculation */ /*------------------------------------------------------------*/ /* number of eigenvectors */ IF_OK status += get_i(stdin, prompt,"Number_of_eigenvals", ¶m.Nvecs); /* max Rayleigh iterations */ IF_OK status += get_i(stdin, prompt,"Max_Rayleigh_iters", ¶m.MaxIter); /* Restart Rayleigh every so many iterations */ IF_OK status += get_i(stdin, prompt,"Restart_Rayleigh", ¶m.Restart); /* Kalkreuter iterations */ IF_OK status += get_i(stdin, prompt,"Kalkreuter_iters", ¶m.Kiters); /* Tolerance for the eigenvalue computation */ IF_OK status += get_f(stdin, prompt,"eigenval_tolerance", ¶m.eigenval_tol); /* error decrease per Rayleigh minimization */ IF_OK status += get_f(stdin, prompt,"error_decrease", ¶m.error_decr); /* eigenvector input */ IF_OK status += ask_starting_ks_eigen(stdin, prompt, ¶m.ks_eigen_startflag, param.ks_eigen_startfile); /* eigenvector output */ IF_OK status += ask_ending_ks_eigen(stdin, prompt, ¶m.ks_eigen_saveflag, param.ks_eigen_savefile); #endif /*------------------------------------------------------------*/ /* Chiral condensate and related quantities */ /*------------------------------------------------------------*/ IF_OK status += get_i(stdin,prompt,"number_of_sets", ¶m.num_set); if( param.num_set>MAX_SET ){ printf("num_set = %d must be <= %d!\n", param.num_set, MAX_SET); status++; } npbp_masses = 0; IF_OK for(k = 0; k < param.num_set; k++){ int max_cg_iterations, max_cg_restarts, prec_pbp; Real error_for_propagator, rel_error_for_propagator; #ifdef CURRENT_DISC int max_cg_iterations_sloppy, max_cg_restarts_sloppy, prec_pbp_sloppy; Real error_for_propagator_sloppy, rel_error_for_propagator_sloppy; #endif /* Number of stochastic sources */ IF_OK status += get_i(stdin, prompt, "npbp_reps", ¶m.npbp_reps[k] ); #ifdef CURRENT_DISC /* For some applications. Random source count between writes */ IF_OK status += get_i(stdin, prompt, "nwrite", ¶m.nwrite[k] ); IF_OK status += get_i(stdin, prompt, "source_spacing", ¶m.thinning[k] ); /* For truncated solver Take difference of sloppy and precise?*/ char savebuf[128]; IF_OK status += get_s(stdin, prompt, "take_truncate_diff", savebuf); IF_OK { if(strcmp(savebuf,"no") == 0)param.truncate_diff[k] = 0; else if(strcmp(savebuf,"yes") == 0)param.truncate_diff[k] = 1; else { printf("Unrecognized response %s\n",savebuf); printf("Choices are 'yes' and 'no'\n"); status++; } } #endif /* The following parameters are common to the set and will be copied to each member */ /* maximum no. of conjugate gradient iterations */ IF_OK status += get_i(stdin,prompt,"max_cg_iterations", &max_cg_iterations ); /* maximum no. of conjugate gradient restarts */ IF_OK status += get_i(stdin,prompt,"max_cg_restarts", &max_cg_restarts ); IF_OK status += get_i(stdin, prompt, "prec_pbp", &prec_pbp ); #ifdef CURRENT_DISC /* If we are taking the difference between a sloppy and a precise solve, get the sloppy solve parameters */ if(param.truncate_diff[k]){ Real error_for_propagator_sloppy, rel_error_for_propagator_sloppy; /* The following parameters are common to the set and will be copied to each member */ /* maximum no. of conjugate gradient iterations */ IF_OK status += get_i(stdin,prompt,"max_cg_iterations_sloppy", &max_cg_iterations_sloppy ); /* maximum no. of conjugate gradient restarts */ IF_OK status += get_i(stdin,prompt,"max_cg_restarts_sloppy", &max_cg_restarts_sloppy ); IF_OK status += get_i(stdin, prompt, "prec_pbp_sloppy", &prec_pbp_sloppy ); } #endif /* Number of pbp masses in this set */ IF_OK status += get_i(stdin, prompt, "number_of_pbp_masses", ¶m.num_pbp_masses[k]); if(param.num_pbp_masses[k] > MAX_MASS_PBP){ printf("Number of masses exceeds dimension %d\n",MAX_MASS_PBP); status++; } /* Indexing range for set */ param.begin_pbp_masses[k] = npbp_masses; param.end_pbp_masses[k] = npbp_masses + param.num_pbp_masses[k] - 1; if(param.end_pbp_masses[k] > MAX_PBP_MASSES){ printf("Total number of masses must be <= %d!\n", MAX_PBP_MASSES); status++; } IF_OK for(i = 0; i < param.num_pbp_masses[k]; i++){ /* PBP mass parameters */ IF_OK status += get_s(stdin, prompt,"mass", param.mass_label[npbp_masses] ); IF_OK param.ksp_pbp[npbp_masses].mass = atof(param.mass_label[npbp_masses]); #if ( FERM_ACTION == HISQ || FERM_ACTION == HYPISQ ) IF_OK status += get_f(stdin, prompt,"naik_term_epsilon", ¶m.ksp_pbp[npbp_masses].naik_term_epsilon ); #else IF_OK param.ksp_pbp[npbp_masses].naik_term_epsilon = 0.0; #endif /* error for staggered propagator conjugate gradient */ IF_OK status += get_f(stdin, prompt,"error_for_propagator", &error_for_propagator ); IF_OK status += get_f(stdin, prompt,"rel_error_for_propagator", &rel_error_for_propagator ); #ifdef CURRENT_DISC if(param.truncate_diff[k]){ /* error for staggered propagator conjugate gradient */ IF_OK status += get_f(stdin, prompt,"error_for_propagator_sloppy", &error_for_propagator_sloppy ); IF_OK status += get_f(stdin, prompt,"rel_error_for_propagator_sloppy", &rel_error_for_propagator_sloppy ); } IF_OK status += get_s(stdin, prompt, "save_file", param.pbp_filenames[npbp_masses] ); #endif /* The set to which this pbp_mass belongs */ IF_OK param.set[npbp_masses] = k; /* maximum no. of conjugate gradient iterations */ param.qic_pbp[npbp_masses].max = max_cg_iterations; /* maximum no. of conjugate gradient restarts */ param.qic_pbp[npbp_masses].nrestart = max_cg_restarts; /* precision */ param.qic_pbp[npbp_masses].prec = prec_pbp; /* errors */ param.qic_pbp[npbp_masses].resid = error_for_propagator; param.qic_pbp[npbp_masses].relresid = rel_error_for_propagator; param.qic_pbp[npbp_masses].parity = EVENANDODD; param.qic_pbp[npbp_masses].min = 0; param.qic_pbp[npbp_masses].start_flag = 0; param.qic_pbp[npbp_masses].nsrc = 1; #ifdef CURRENT_DISC /* If we are taking the difference between a sloppy and a precise solve, get the sloppy solve parameters */ if(param.truncate_diff[k]){ /* maximum no. of conjugate gradient iterations */ param.qic_pbp_sloppy[npbp_masses].max = max_cg_iterations_sloppy; /* maximum no. of conjugate gradient restarts */ param.qic_pbp_sloppy[npbp_masses].nrestart = max_cg_restarts_sloppy; /* precision */ param.qic_pbp_sloppy[npbp_masses].prec = prec_pbp_sloppy; /* errors */ param.qic_pbp_sloppy[npbp_masses].resid = error_for_propagator_sloppy; param.qic_pbp_sloppy[npbp_masses].relresid = rel_error_for_propagator_sloppy; param.qic_pbp_sloppy[npbp_masses].parity = EVENANDODD; param.qic_pbp_sloppy[npbp_masses].min = 0; param.qic_pbp_sloppy[npbp_masses].start_flag = 0; param.qic_pbp_sloppy[npbp_masses].nsrc = 1; } #endif npbp_masses++; } } /* End of input fields */ if( status > 0)param.stopflag=1; else param.stopflag=0; } /* end if(this_node==0) */
/* SETUP ROUTINES */ static int initial_set(){ int prompt,status; #ifdef FIX_NODE_GEOM int i; #endif /* On node zero, read lattice size and send to others */ if(mynode()==0){ /* print banner */ printf("SU3 staggered fermion measurements\n"); printf("MIMD version %s\n",MILC_CODE_VERSION); printf("Machine = %s, with %d nodes\n",machine_type(),numnodes()); gethostname(hostname, 128); printf("Host(0) = %s\n",hostname); printf("Username = %s\n", getenv("USER")); time_stamp("start"); get_utc_datetime(utc_date_time); /* Print list of options selected */ node0_printf("Options selected...\n"); show_generic_opts(); show_generic_ks_opts(); #if FERM_ACTION == HISQ show_su3_mat_opts(); show_hisq_links_opts(); #elif FERM_ACTION == HYPISQ show_su3_mat_opts(); show_hypisq_links_opts(); #endif status = get_prompt(stdin, &prompt ); IF_OK status += get_i(stdin,prompt,"nx", ¶m.nx ); IF_OK status += get_i(stdin,prompt,"ny", ¶m.ny ); IF_OK status += get_i(stdin,prompt,"nz", ¶m.nz ); IF_OK status += get_i(stdin,prompt,"nt", ¶m.nt ); #ifdef FIX_NODE_GEOM IF_OK status += get_vi(stdin, prompt, "node_geometry", param.node_geometry, 4); #ifdef FIX_IONODE_GEOM IF_OK status += get_vi(stdin, prompt, "ionode_geometry", param.ionode_geometry, 4); #endif #endif IF_OK status += get_i(stdin, prompt,"iseed", ¶m.iseed ); IF_OK status += get_s(stdin, prompt,"job_id",param.job_id); if(status>0) param.stopflag=1; else param.stopflag=0; } /* end if(mynode()==0) */ /* Node 0 broadcasts parameter buffer to all other nodes */ broadcast_bytes((char *)¶m,sizeof(param)); if( param.stopflag != 0 ) normal_exit(0); if(prompt==2)return prompt; nx=param.nx; ny=param.ny; nz=param.nz; nt=param.nt; iseed=param.iseed; #ifdef FIX_NODE_GEOM for(i = 0; i < 4; i++) node_geometry[i] = param.node_geometry[i]; #ifdef FIX_IONODE_GEOM for(i = 0; i < 4; i++) ionode_geometry[i] = param.ionode_geometry[i]; #endif #endif this_node = mynode(); number_of_nodes = numnodes(); volume=nx*ny*nz*nt; return(prompt); }