]> git.treefish.org Git - phys/latlib.git/blob - paraq.cpp
e66f13860ff44a8880319a0224fd5458356a489d
[phys/latlib.git] / paraq.cpp
1 #include "paraq.h"
2
3 #include <algorithm>
4 #include <iostream>
5 #include <math.h>
6
7 using namespace std;
8
9 paraq::paraq(int _nprocs, const int _rank)
10 {
11   thisjob = -1;
12   nprocs = _nprocs;
13   rank = _rank;
14   masterdefault = 0;
15 }
16
17 void paraq::addRange(const string& paraid, double min, double max, double step)
18 {
19   for( double paraval = min; paraval <= max+0.5*step; paraval += step+(step==0) )
20     if( ! inParas(paraMap[paraid], paraval) ) paraMap[paraid].push_back( paraval );
21 }
22
23 bool paraq::inParas( vector<double>& paraVec, double& tofind )
24 {
25   for( vector<double>::iterator it = paraVec.begin(); it < paraVec.end(); ++it) 
26     if( fabs(*it - tofind) < 0.0000000001 ) return true;
27   return false;
28 }
29
30 int paraq::nextParas()
31 {
32   if( thisjob == -1 ) {   
33     map<string,double> jobZero;
34     jobList.push_back( jobZero );
35
36     for( map< string, vector< double > >::iterator paraIt = paraMap.begin(); paraIt != paraMap.end(); ++paraIt )
37       while( jobList.begin()->find(paraIt->first) == jobList.begin()->end() ) {
38         for( vector<double>::iterator valIt = paraIt->second.begin(); valIt != paraIt->second.end(); ++valIt ) {
39           jobList.push_back( *jobList.begin() );
40           jobList.back()[paraIt->first] = *valIt;
41         }       
42         jobList.erase( jobList.begin() );
43       }
44
45     thisjob = rank;
46   }
47   else
48     thisjob += nprocs;
49
50   if( thisjob < jobList.size() ) return 1;
51   else 
52     return 0;
53 }
54
55 double& paraq::operator[] (string paraid) { 
56   if( jobList[thisjob].find(paraid) != jobList[thisjob].end() ) {
57     return jobList[thisjob][paraid];
58   }
59
60   if( defaultPara.find(paraid) != defaultPara.end() ) {
61     return defaultPara[paraid];
62   }
63
64   return masterdefault;
65 }