10 #define PRINT_WIDTH 15
11 #define PRINT_PRECISION 7
19 IOParamsPrintHelp(
const int _offset_short_key,
const int _offset_long_key,
const int _width_key):
23 os<<
"I: 64bit integer; F: 64bit floating; S: string\n";
49 template <
class TContainer>
50 IOParams(TContainer& _ioc,
const Type& _value,
const char* _key,
const char* _name,
const char* _defaulted=NULL,
const bool _print_help_flag=
true):
value(_value),
key(_key),
name(_name),
defaulted(_defaulted),
print_help_flag(_print_help_flag) {
51 _ioc.store(_key,
this);
54 void print(std::ostream& os)
const{
66 <<std::left<<std::setw(_align.
width_key)<<
key<<std::right;
84 bool operator () (
const char *a,
const char *b)
const {
88 std::map<const char*, IOParams<double>*, char_cmp> d_f64;
89 std::map<const char*, IOParams<long long int>*, char_cmp> d_i64;
90 std::map<const char*, IOParams<std::string>*, char_cmp> d_str;
103 d_str[_name] = _item;
115 while (!feof(_fin)) {
118 rcount=fscanf(_fin,
"%c ", &type_id);
120 std::cerr<<
"Error: Data reading fails! requiring data number is 1, only obtain "<<rcount<<
".\n";
128 rcount=fscanf(_fin,
"%s %lf\n", key_name, &dtmp);
130 std::cerr<<
"Error: Data reading fails! requiring data number is 2, only obtain "<<rcount<<
".\n";
133 auto search = d_f64.find(key_name);
134 if (search == d_f64.end())
135 std::cerr<<
"Warning: parameter name key "<<key_name<<
" is not found!\n";
137 search->second->value = dtmp;
143 rcount=fscanf(_fin,
"%s %lld\n", key_name, &dtmp);
145 std::cerr<<
"Error: Data reading fails! requiring data number is 2, only obtain "<<rcount<<
".\n";
148 auto search = d_i64.find(key_name);
149 if (search == d_i64.end())
150 std::cerr<<
"Warning: parameter name key "<<key_name<<
" is not found!\n";
152 search->second->value = dtmp;
158 rcount=fscanf(_fin,
"%s %s\n", key_name, dtmp);
160 std::cerr<<
"Error: Data reading fails! requiring data number is 2, only obtain "<<rcount<<
".\n";
163 auto search = d_str.find(key_name);
164 if (search == d_str.end())
165 std::cerr<<
"Warning: parameter name key "<<key_name<<
" is not found!\n";
167 search->second->value = dtmp;
171 std::cerr<<
"Warning: parameter type not found, given "<<type_id<<
", should be one of F, L, I, S\n";
177 #ifdef PARTICLE_SIMULATOR_MPI_PARALLEL
178 void mpi_broadcast() {
179 for(
auto iter=d_f64.begin(); iter!=d_f64.end(); iter++) PS::Comm::broadcast(&(iter->second->value), 1, 0);
180 for(
auto iter=d_i64.begin(); iter!=d_i64.end(); iter++) PS::Comm::broadcast(&(iter->second->value), 1, 0);
181 for(
auto iter=d_str.begin(); iter!=d_str.end(); iter++) {
182 size_t str_size=iter->second->value.size();
183 PS::Comm::broadcast(&str_size, 1, 0);
184 char stmp[str_size+1];
185 std::strcpy(stmp, iter->second->value.c_str());
186 PS::Comm::broadcast(stmp, str_size, 0);
187 iter->second->value = std::string(stmp);
193 for(
auto iter=d_f64.begin(); iter!=d_f64.end(); iter++) os<<iter->first<<
": "<<iter->second->value<<std::endl;
194 for(
auto iter=d_i64.begin(); iter!=d_i64.end(); iter++) os<<iter->first<<
": "<<iter->second->value<<std::endl;
195 for(
auto iter=d_str.begin(); iter!=d_str.end(); iter++) os<<iter->first<<
": "<<iter->second->value<<std::endl;
198 void printHelp(std::ostream& os,
const int _offset_short_key=2,
const int _offset_long_key=1,
const int _width_key=23)
const{
200 std::cout<<
" default values are shown after ':'\n"
201 <<
" the char in [] indicates argument type: ";
203 for(
auto iter=d_f64.begin(); iter!=d_f64.end(); iter++) iter->second->printHelp(os, print_help);
204 for(
auto iter=d_i64.begin(); iter!=d_i64.end(); iter++) iter->second->printHelp(os, print_help);
205 for(
auto iter=d_str.begin(); iter!=d_str.end(); iter++) iter->second->printHelp(os, print_help);
215 #ifdef RECORD_CM_IN_HEADER
222 #ifdef RECORD_CM_IN_HEADER
227 #ifdef RECORD_CM_IN_HEADER
236 int rcount=fscanf(
fp,
"%lld %lld %lf %lf %lf %lf %lf %lf %lf\n", &
nfile, &
n_body, &
time, &pos_offset.x,&pos_offset.y, &pos_offset.z, &vel_offset.x, &vel_offset.y, &vel_offset.z);
238 std::cerr<<
"Error: cannot read header, please check your data file header!\n";
246 fprintf(
fp,
"%lld %lld %26.17e %26.17e %26.17e %26.17e %26.17e %26.17e %26.17e\n",
nfile,
n_body,
time, pos_offset.x, pos_offset.y, pos_offset.z, vel_offset.x, vel_offset.y, vel_offset.z);
249 FileHeader(
const long long int ni,
const long long int n,
const double t) {
258 std::cerr<<
"Error: cannot read header, please check your data file header!\n";
272 std::cerr<<
"Error: Data reading fails! requiring data number is "<<1<<
" bytes, only obtain "<<rcount<<
" bytes.\n";