[Debian-astro-commits] [gyoto] 22/221: MPI actually working, at least for quantity "intensity".
Thibaut Jean-Claude Paumard
thibaut at moszumanska.debian.org
Fri May 22 20:52:30 UTC 2015
This is an automated email from the git hooks/post-receive script.
thibaut pushed a commit to branch master
in repository gyoto.
commit 87e22922c0b79bad3ba4163476824b237a9d7e03
Author: Thibaut Paumard <paumard at users.sourceforge.net>
Date: Wed Oct 8 18:17:28 2014 +0200
MPI actually working, at least for quantity "intensity".
---
bin/gyoto-mpi-worker.C | 83 +++++++++++++++++++++++++++++++++----
doc/examples/example-fixed-star.xml | 2 +
include/GyotoScenery.h | 2 -
lib/Photon.C | 4 +-
lib/Scenery.C | 28 +++++++++++--
5 files changed, 105 insertions(+), 14 deletions(-)
diff --git a/bin/gyoto-mpi-worker.C b/bin/gyoto-mpi-worker.C
index e0096f1..24fa563 100644
--- a/bin/gyoto-mpi-worker.C
+++ b/bin/gyoto-mpi-worker.C
@@ -113,9 +113,6 @@ int main(int argc, char** argv) {
Gyoto::Register::init(pluglist.c_str());
int rk=world.rank();
- srand(rk);
- long delay;
-
//Gyoto::debug(1);
@@ -133,18 +130,90 @@ int main(int argc, char** argv) {
curmsg = "In gyoto.C: Error in Factory creation: ";
curretval = 1;
sc = Factory(const_cast<char*>(parfile.c_str())).getScenery();
+ cerr <<"Maxiter=="<<sc->maxiter()<<endl;
break;
}
case Scenery::raytrace: {
size_t ij[2]={0, 0};
// std::cerr << "Worker #" << rk << " receiving ij for raytracing" <<std::endl;
manager.recv(0, task, ij, 2);
- delay=long(double(rand())/double(RAND_MAX)*1e6);
- std::cerr << "Worker #" << rk << " raytracing i="<<ij[0]<<", j="<<ij[1]
- <<" (actually sleeping for "<<delay<<"µs)"<<std::endl;
- usleep(delay);
+ std::cerr << "Worker #" << rk << " raytracing i="<<ij[0]<<", j="<<ij[1]<<std::endl;
+
+
+ // initialize AstrobjProperties
+ size_t nbnuobs=0;
+ Quantity_t quantities = sc -> getRequestedQuantities();
+ if (quantities & (GYOTO_QUANTITY_SPECTRUM | GYOTO_QUANTITY_BINSPECTRUM)) {
+ SmartPointer<Spectrometer::Generic> spr = sc -> screen() -> spectrometer();
+ if (!spr) throwError("Spectral quantity requested but "
+ "no spectrometer specified!");
+ nbnuobs = spr -> nSamples();
+ }
+ size_t nbdata= sc->getScalarQuantitiesCount();
+ size_t nelt=(nbdata+nbnuobs);
+ vect = new double[nelt];
+ data = new Astrobj::Properties();
+ size_t offset=1;
+ size_t curquant=0;
+
+ if (quantities & GYOTO_QUANTITY_INTENSITY) {
+ data->intensity=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_EMISSIONTIME) {
+ data->time=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_MIN_DISTANCE) {
+ data->distance=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_FIRST_DMIN) {
+ data->first_dmin=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_REDSHIFT) {
+ data->redshift=vect+offset*(curquant++);
+ }
+ // if ((quantities & GYOTO_QUANTITY_IMPACTCOORDS || ipct) && !ipctdims[0] ) {
+ // data->impactcoords = impactcoords = new double [res*res*16];
+ // ipcttime = tobs * GYOTO_C / scenery -> metric() -> unitLength();
+ // }
+ if (quantities & GYOTO_QUANTITY_USER1) {
+ data->user1=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_USER2) {
+ data->user2=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_USER3) {
+ data->user3=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_USER4) {
+ data->user4=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_USER5) {
+ data->user5=vect+offset*(curquant++);
+ }
+ if (quantities & GYOTO_QUANTITY_SPECTRUM) {
+ data->spectrum=vect+offset*(curquant++);
+ data->offset=int(offset);
+ }
+ if (quantities & GYOTO_QUANTITY_BINSPECTRUM) {
+ data->binspectrum=vect+offset*(curquant++);
+ data->offset=int(offset);
+ }
+
+ data->init(nbnuobs);
+ sc->screen()->computeBaseVectors();
+ sc->setPropertyConverters(data);
+
+ // need to do something about impactcoords
+
+ (*sc)(ij[0], ij[1], data, NULL, NULL);
manager.send(0, Scenery::raytrace_done, rk);
+ manager.send(0, Scenery::raytrace_done, ij, 2);
+ manager.send(0, Scenery::raytrace_done, nelt);
+ manager.send(0, Scenery::raytrace_done, vect, nelt);
+
+ delete[] vect;
+ delete data;
// std::cerr << "Worker #" << rk << " done raytracing i="<<ij[0]<<", j="<<ij[1]<<std::endl;
}
diff --git a/doc/examples/example-fixed-star.xml b/doc/examples/example-fixed-star.xml
index 02b5ab5..f1c961d 100644
--- a/doc/examples/example-fixed-star.xml
+++ b/doc/examples/example-fixed-star.xml
@@ -44,4 +44,6 @@
Intensity[mJy.sr-1]
Intensity[Jy.sr-1]
+ <NProcesses>12</NProcesses>
+
</Scenery>
diff --git a/include/GyotoScenery.h b/include/GyotoScenery.h
index 5f39211..d003b3f 100644
--- a/include/GyotoScenery.h
+++ b/include/GyotoScenery.h
@@ -211,8 +211,6 @@ class Gyoto::Scenery : protected Gyoto::SmartPointee {
Gyoto::SmartPointer<Gyoto::Units::Converter> binspectrum_converter_;
# endif
- size_t maxiter_ ; ///< Maximum number of iterations when integrating
-
# ifdef HAVE_MPI
boost::mpi::environment * mpi_env_;
boost::mpi::communicator * mpi_world_;
diff --git a/lib/Photon.C b/lib/Photon.C
index f6d4b9d..06171d9 100644
--- a/lib/Photon.C
+++ b/lib/Photon.C
@@ -326,8 +326,8 @@ int Photon::hit(Astrobj::Properties *data) {
}
if ( ++count > maxiter_ ) {
- GYOTO_SEVERE << "Photon::hit: too many iterations, "
- <<" break" << endl;
+ GYOTO_SEVERE << "Photon::hit: too many iterations ("<<count<<" vs. "
+ << maxiter_<<"), break" << endl;
stopcond = 1;
break;
}
diff --git a/lib/Scenery.C b/lib/Scenery.C
index 124a85f..9ff7630 100644
--- a/lib/Scenery.C
+++ b/lib/Scenery.C
@@ -249,6 +249,7 @@ void Scenery::rayTrace(size_t imin, size_t imax,
size_t ij[2]={imin, jmin};
int working = 0;
+ if (data) data->init(0);
// initiate raytracing
for (int w=0; w<mpi_workers_->remote_size(); ++w) {
@@ -272,10 +273,28 @@ void Scenery::rayTrace(size_t imin, size_t imax,
// receive one result, need to track back where it belongs and
// store it there
int w;
+ size_t nelt;
+ double * vect;
+ size_t ijr[2];
cerr << "Manager waiting for worker to send result" << endl;
mpi_workers_ -> recv(mpi::any_source, raytrace_done, w);
cerr << "Manager received result from worker #"<<w << endl;
+ mpi_workers_ -> recv(w, raytrace_done, ijr, 2);
+ mpi_workers_ -> recv(w, raytrace_done, nelt);
+ vect=new double[nelt];
+ mpi_workers_ -> recv(w, raytrace_done, vect, nelt);
+
+ Astrobj::Properties *databis=data;
+ databis += (ijr[1]-1)*npix+ijr[0];
+ size_t offset=1;
+ size_t curquant=0;
+
+ if (data->intensity) data->intensity[(ijr[1]-1)*npix+ijr[0]]=*(vect+offset*(curquant++));
+ //populate other quantities
+
+ delete[] vect;
+
// give new task or decrease working counter
if (ij[0]<=imax) {
mpi_workers_ -> send(w, give_task, raytrace);
@@ -631,7 +650,7 @@ void Scenery::fillElement(FactoryMessenger *fmp) {
fmp -> setParameter("RelTol", ph_.relTol());
fmp -> setParameter ("Delta", delta_);
fmp -> setParameter (adaptive()?"Adaptive":"NonAdaptive");
- fmp -> setParameter("MaxIter", maxiter_);
+ fmp -> setParameter("MaxIter", maxiter());
if (getRequestedQuantities())
fmp -> setParameter("Quantities", getRequestedQuantitiesString());
@@ -654,6 +673,8 @@ SmartPointer<Scenery> Gyoto::Scenery::Subcontractor(FactoryMessenger* fmp) {
SmartPointer<Scenery> sc = new Scenery(gg, scr, ao);
+ int mpi=0;
+
while (fmp->getNextParameter(&name, &content, &unit)) {
char* tc = const_cast<char*>(content.c_str());
if (name=="Delta") sc -> delta(atof(tc), unit);;
@@ -670,12 +691,13 @@ SmartPointer<Scenery> Gyoto::Scenery::Subcontractor(FactoryMessenger* fmp) {
if (name=="DeltaMaxOverR") sc -> ph_ . deltaMaxOverR (atof(content.c_str()));
if (name=="AbsTol") sc -> ph_ . absTol(atof(content.c_str()));
if (name=="RelTol") sc -> ph_ . relTol(atof(content.c_str()));
+ if (name=="NProcesses") mpi=atoi(tc);
}
#ifdef HAVE_MPI
- if (!Scenery::is_worker) {
- sc -> mpiSpawn(5);
+ if (!Scenery::is_worker && mpi) {
+ sc -> mpiSpawn(mpi);
sc -> mpiClone();
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-astro/packages/gyoto.git
More information about the Debian-astro-commits
mailing list