]> git.treefish.org Git - phys/latlib.git/blob - o815/o815.cpp
9b0fff81d3988f515a229e60c98159b7dc9b8f48
[phys/latlib.git] / o815 / o815.cpp
1 #include "o815.h"
2
3 #include <sstream>
4
5 #include "latlib/progress.h"
6
7 extern int opterr;
8
9 o815::o815(int argc, char **argv, const string& _programid) {
10   long timestamp;
11
12   programid = _programid;
13
14   comargs.nmeas = 100;
15   comargs.nskip = 10;
16   comargs.nequi = 100;
17   comargs.lsize[0] = 4;
18   comargs.lsize[1] = 4;
19   comargs.obscache = make_pair("",0);
20   comargs.confcache = make_pair("",0);
21   comargs.outdir="";
22   comargs.idonly = false;
23   comargs.showjobnum = false;
24
25   MPI_Init(&argc, &argv);
26   MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
27   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
28
29   paraQ = new paraq(numprocs, rank);
30
31   parseArgs(argc, argv);
32
33   if(comargs.idonly) {
34     cout << programid << headMaster() << endl << flush;
35     exit(0);
36   }
37
38   if(rank==0) {
39     timestamp = time(NULL);
40     for(int idest=1; idest<numprocs; idest++)
41       MPI_Send(&timestamp, 1, MPI_LONG, idest, 123, MPI_COMM_WORLD);
42   }
43   else if(rank>0)
44     MPI_Recv(&timestamp, 1, MPI_LONG, 0, 123, MPI_COMM_WORLD, &mpiStatus);
45   
46   out = new writeout(comargs.outdir, programid+headMaster(), rank, numprocs, timestamp);
47 }
48
49 void o815::mainLoop() {
50   if( comargs.showjobnum ) {
51     for( int i=1; i<=paraQ->getTotalJobs(); i++ ) {
52       if( paraQ->getTotalJobs()%i == 0 ) cout << paraQ->getTotalJobs()/i << "@" << i << " ";
53     }
54     cout << endl;
55     exit(0);
56   }
57
58   *out->log << "OBS: Starting main loop." << endl;
59
60   for (vector<obs*>::iterator obsit = observables.begin(); obsit != observables.end(); ++obsit)
61     (*obsit)->start();
62
63   while( nextParas() ) {
64     *out->log << endl << "O815: < ";
65     for (vector<string>::iterator parait = paraQ->allParaIds.begin(); parait != paraQ->allParaIds.end(); ++parait)
66       *out->log << *parait << "=" << (*paraQ)[*parait] << " ";
67     *out->log << ">" << endl << flush;
68     
69     progress measProg(comargs.nmeas);
70
71     *out->log << "OBS: Starting measurement of observables:";
72     for (vector<obs*>::iterator obsit = observables.begin(); obsit != observables.end(); ++obsit)
73       *out->log << " " << (*obsit)->obsid;
74     *out->log << endl << flush;
75
76     Sim->toEquilibrate = true;
77
78     for( int imeas=0; imeas<comargs.nmeas; imeas++ ) {
79       bool nextAlready = false;
80       for (vector<obs*>::iterator obsit = observables.begin(); obsit != observables.end(); ++obsit) {
81         if( hypercache::readO( (*obsit)->ocid ) != -1 ) {
82           if (!nextAlready) {
83             Sim->nextConfig();
84             nextAlready = true;
85           }
86           (*obsit)->meas(false);
87           hypercache::writeO( (*obsit)->ocid );
88         }
89         else
90           (*obsit)->meas(true);
91       }
92       while( measProg.madeStep(imeas) ) 
93         *out->log << "O815: " << measProg.done()*100 << "% of measurements done." << endl << flush;
94     }
95     for (vector<obs*>::iterator obsit = observables.begin(); obsit != observables.end(); ++obsit)
96       (*obsit)->finish();
97   }
98 }
99
100 void o815::parseArgs(int argc, char **argv) {
101   int opt = 0;
102   
103   opterr = 0;
104
105   while( (opt = getopt(argc, argv, "L:N:S:E:o:O:c:C:w:i:j:")) != -1 )
106     switch(opt) {
107     case 'L':
108       listArg(comargs.lsize, 2, optarg);
109       break;
110     case 'N':
111       comargs.nmeas = atoi(optarg);
112       break;
113     case 'S':
114       comargs.nskip = atoi(optarg);
115       break;
116     case 'E':
117       comargs.nequi = atoi(optarg);
118       break;
119     case 'o':
120       comargs.obscache.first = optarg;
121       comargs.obscache.second = 1;
122       break;
123     case 'O':
124       comargs.obscache.first = optarg;
125       comargs.obscache.second = 2;
126       break;
127     case 'c':
128       comargs.confcache.first = optarg;
129       comargs.confcache.second = 1;
130       break;
131     case 'C':
132       comargs.confcache.first = optarg;
133       comargs.confcache.second = 2;
134       break;
135     case 'w':
136       comargs.outdir = optarg;
137       break;
138     case 'i':
139       comargs.idonly = atoi(optarg);
140       break;
141     case 'j':
142       comargs.showjobnum = atoi(optarg);
143       break;
144     }
145 }
146
147 void o815::listArg(int *target, int tlen, char *listarg) {
148   int nargs=0;
149   
150   for( int pos=0; pos<strlen(listarg); pos++ ) 
151     if( listarg[pos] == ':' ) nargs++;
152   
153   if(nargs==0) 
154     for(int i=0; i<tlen; i++) target[i] = atoi(listarg);
155   else
156     {
157       target[0] = atoi(strtok(listarg, ":"));
158       for(int i=0; i<nargs; i++)
159         target[i+1] = atoi(strtok(NULL, ":"));
160     }
161 }
162
163 string o815::headMaster()
164 {
165   stringstream hm;
166   
167   hm << "-L" << comargs.lsize[0] << "_" << comargs.lsize[1] << "-E" << comargs.nequi << "-S" << comargs.nskip << "-N" << comargs.nmeas 
168      << paraQ->rangeString();
169   
170   return hm.str();
171 }
172
173 o815::~o815() {
174   if(comargs.outdir=="") {
175     MPI_Barrier(MPI_COMM_WORLD);
176     if(rank==0)
177       cout << "#end" << endl << flush;
178   }
179   hypercache::finalize();
180   delete out;
181   MPI_Finalize();
182 }
183
184 int o815::nextParas()
185 {
186   if( paraQ->nextParas() ) {
187     for (vector<string>::iterator parait = paraQ->allParaIds.begin(); parait != paraQ->allParaIds.end(); ++parait)
188       hypercache::setPara(*parait, (*paraQ)[*parait]);
189     return 1;
190   }
191   else
192     return 0;
193 }
194
195 void o815::addPara(const string& paraid, const double& paraDefault) {
196   hypercache::addPara(paraid);
197   paraQ->setDefault(paraid, paraDefault);
198 }