]> git.treefish.org Git - phys/latlib.git/blob - paraq.cpp
1bd57b3275f428a38bb597a451b8da900f070713
[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   jobListInitialized = false;
16 }
17
18 void paraq::addRange(const string& paraid, double min, double max, double step)
19 {
20   for( double paraval = min; paraval <= max+0.5*step; paraval += step+(step==0) )
21     if( ! inParas(paraMap[paraid], paraval) ) paraMap[paraid].push_back( paraval );
22 }
23
24 bool paraq::inParas( vector<double>& paraVec, double& tofind )
25 {
26   for( vector<double>::iterator it = paraVec.begin(); it < paraVec.end(); ++it) 
27     if( fabs(*it - tofind) < 0.0000000001 ) return true;
28   return false;
29 }
30
31 void paraq::initJobList()
32 {
33   if( ! jobListInitialized ) {
34     map<string,double> jobZero;
35     jobList.push_back( jobZero );
36     
37     for( map< string, vector< double > >::iterator paraIt = paraMap.begin(); paraIt != paraMap.end(); ++paraIt )
38       while( jobList.begin()->find(paraIt->first) == jobList.begin()->end() ) {
39         for( vector<double>::iterator valIt = paraIt->second.begin(); valIt != paraIt->second.end(); ++valIt ) {
40           jobList.push_back( *jobList.begin() );
41           jobList.back()[paraIt->first] = *valIt;
42         }       
43         jobList.erase( jobList.begin() );
44       }
45     jobListInitialized = true;
46   }
47 }
48
49 int paraq::nextParas()
50 {
51   if( thisjob == -1 ) {   
52     initJobList();
53     thisjob = rank;
54   }
55   else
56     thisjob += nprocs;
57
58   if( jobList.begin()->size() == 0 ) return 0;
59
60   if( thisjob < jobList.size() ) return 1;
61   else 
62     return 0;
63 }
64
65 double& paraq::operator[] (string paraid) { 
66   if( jobList[thisjob].find(paraid) != jobList[thisjob].end() ) {
67     return jobList[thisjob][paraid];
68   }
69
70   if( defaultPara.find(paraid) != defaultPara.end() ) {
71     return defaultPara[paraid];
72   }
73
74   return masterdefault;
75 }
76
77 int paraq::getTotalJobs() { 
78   initJobList();
79   return jobList.size(); 
80 }