Skip to content

Commit

Permalink
use __gnu_parallel::transform instead of std::transform (faster)
Browse files Browse the repository at this point in the history
plus small changes in examples
  • Loading branch information
cosurgi committed Aug 4, 2015
1 parent 68b6912 commit 0a5694c
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 42 deletions.
38 changes: 19 additions & 19 deletions examples/qm/2d-coulomb-small-TEN-2.py
Expand Up @@ -35,7 +35,7 @@
[Ip2_QMParameters_QMParametersCoulomb_QMIPhysCoulomb()],
[Law2_QMIGeom_QMIPhysCoulomb()]
),
SchrodingerKosloffPropagator(steps=-1,threadNum=4),
SchrodingerKosloffPropagator(steps=-1,threadNum=8),
]

partsScale = 20000
Expand Down Expand Up @@ -90,24 +90,24 @@
#O.save('/tmp/a.xml.bz2');
#o.run(100000); o.wait(); print o.iter/o.realtime,'iterations/sec'

try:
from yade import qt
qt.Controller()
qt.controller.setViewAxes(dir=(0,1,0),up=(0,0,1))
qt.controller.setWindowTitle(sys.argv[0])
qt.Renderer().blinkHighlight=False
qt.View()
qt.Renderer().light2Pos=[Pot_x,Pot_y,30]
qt.views()[0].center(False,250) # median=False, suggestedRadius = 5
## try:
## from yade import qt
## qt.Controller()
## qt.controller.setViewAxes(dir=(0,1,0),up=(0,0,1))
## qt.controller.setWindowTitle(sys.argv[0])
## qt.Renderer().blinkHighlight=False
## qt.View()
## qt.Renderer().light2Pos=[Pot_x,Pot_y,30]
## qt.views()[0].center(False,250) # median=False, suggestedRadius = 5
##
## except ImportError:
## pass

except ImportError:
pass

O.dt=0.0000001
for i in range(51):
O.step()
O.dt=200
if(i%5==0):
O.save(str(sys.argv[0])+"_"+str(O.iter)+".yade.gz")

#O.dt=0.0000001
#for i in range(51):
# O.step()
# O.dt=200
# if(i%5==0):
# O.save(str(sys.argv[0])+"_"+str(O.iter)+".yade.bz2")
#
6 changes: 3 additions & 3 deletions examples/qm/2d-hydrogeneigen+positron-small-TEN-2small.py
Expand Up @@ -46,7 +46,7 @@
,Ip2_QMParticleCoulomb_QMParametersCoulomb_QMIPhysCoulombParticleInPotential()],
[Law2_QMIGeom_QMIPhysCoulombParticles(),Law2_QMIGeom_QMIPhysCoulombParticleInPotential()]
),
SchrodingerKosloffPropagator(FIXMEatomowe_MASS=1.0,steps=-1,virialCheck=False,printIter=20,doCopyTable=False,threadNum=8),
SchrodingerKosloffPropagator(FIXMEatomowe_MASS=1.0,steps=-1,virialCheck=False,printIter=1,doCopyTable=False,threadNum=16),
SchrodingerAnalyticPropagator(),
]

Expand Down Expand Up @@ -159,9 +159,9 @@ def placeDraw(di,i,j):
qt.Renderer().blinkHighlight=False
qt.Renderer().light1Pos=Vector3( 1175,1130,500)
qt.Renderer().light2Pos=Vector3(-1130, 575,230)
qt.View()
#qt.View()
#qt.Renderer().light2Pos=Vector3(Pot_x,Pot_y,30)
qt.views()[0].center(False,size1d*1.5) # median=False, suggestedRadius = 5
#qt.views()[0].center(False,size1d*1.5) # median=False, suggestedRadius = 5

except ImportError:
pass
Expand Down
2 changes: 1 addition & 1 deletion examples/qm/3d-coulomb-eigen-wavefunction.py
Expand Up @@ -34,7 +34,7 @@
[Ip2_QMParameters_QMParametersCoulomb_QMIPhysCoulomb()],
[Law2_QMIGeom_QMIPhysCoulomb()]
),
SchrodingerKosloffPropagator(),
SchrodingerKosloffPropagator(threadNum=8),
SchrodingerAnalyticPropagator(),
]

Expand Down
39 changes: 20 additions & 19 deletions lib/base/NDimTable.hpp
Expand Up @@ -25,6 +25,7 @@
#include <iomanip>
#include <boost/lexical_cast.hpp>
#include <Eigen/Core>
#include <parallel/algorithm>

#include <boost/thread/mutex.hpp>
#include <boost/serialization/nvp.hpp>
Expand Down Expand Up @@ -343,18 +344,18 @@ std::cerr << "destructor : " << --ZZ::NDimTable_Instanc
// elementwise operations
NDimTable& operator = (const NDimTable& )=default;
NDimTable& operator = ( NDimTable&&)=default;
NDimTable& operator - ( ) {std::transform(this->begin(),this->end(),this->begin(),[ ](K& v){return -v;}); return *this;};
NDimTable& operator += (const K& k) {std::transform(this->begin(),this->end(),this->begin(),[k](K& v){return v+k;}); return *this;};
NDimTable& operator -= (const K& k) {std::transform(this->begin(),this->end(),this->begin(),[k](K& v){return v-k;}); return *this;};
NDimTable& operator *= (const K& k) {std::transform(this->begin(),this->end(),this->begin(),[k](K& v){return v*k;}); return *this;};
NDimTable& operator /= (const K& k) {std::transform(this->begin(),this->end(),this->begin(),[k](K& v){return v/k;}); return *this;};

template<typename L> NDimTable& operator += (const NDimTable<L>& T) {std::transform(this->begin(),this->end(),T.begin(),this->begin(),[](K& v,const L& l){return v+l;});return *this;};
template<typename L> NDimTable& operator -= (const NDimTable<L>& T) {std::transform(this->begin(),this->end(),T.begin(),this->begin(),[](K& v,const L& l){return v-l;});return *this;};
NDimTable& operator - ( ) {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[ ](K& v){return -v;}); return *this;};
NDimTable& operator += (const K& k) {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[k](K& v){return v+k;}); return *this;};
NDimTable& operator -= (const K& k) {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[k](K& v){return v-k;}); return *this;};
NDimTable& operator *= (const K& k) {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[k](K& v){return v*k;}); return *this;};
NDimTable& operator /= (const K& k) {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[k](K& v){return v/k;}); return *this;};

template<typename L> NDimTable& operator += (const NDimTable<L>& T) {__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[](K& v,const L& l){return v+l;});return *this;};
template<typename L> NDimTable& operator -= (const NDimTable<L>& T) {__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[](K& v,const L& l){return v-l;});return *this;};
// !!!!!!!!!!!
// !IMPORTANT! operators *= and /= implement http://en.wikipedia.org/wiki/Hadamard_product_%28matrices%29
template<typename L> NDimTable& operator *= (const NDimTable<L>& T) {std::transform(this->begin(),this->end(),T.begin(),this->begin(),[](K& v,const L& l){return v*l;});return *this;};
template<typename L> NDimTable& operator /= (const NDimTable<L>& T) {std::transform(this->begin(),this->end(),T.begin(),this->begin(),[](K& v,const L& l){return v/l;});return *this;};
template<typename L> NDimTable& operator *= (const NDimTable<L>& T) {__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[](K& v,const L& l){return v*l;});return *this;};
template<typename L> NDimTable& operator /= (const NDimTable<L>& T) {__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[](K& v,const L& l){return v/l;});return *this;};

// FIXME: should be 'K'-type not 'double'-type. But min(), max() works only with real numbers.
// FIXME: this is because potential should be real valued (but isn't)
Expand All @@ -363,21 +364,21 @@ std::cerr << "destructor : " << --ZZ::NDimTable_Instanc
not_complex maxReal() const {not_complex ret(std::real(this->front())); for(K v : (*this)){ret = std::max(std::real(v),ret);}; return ret;};
// !!!!!!!!!!!
// !IMPORTANT! for effciency, these do not copy construct new data, they modify in-place!
NDimTable& abs() {std::transform(this->begin(),this->end(),this->begin(),[ ](K& v){return std::abs(v );}); return *this;};
NDimTable& pow(const K& k) {std::transform(this->begin(),this->end(),this->begin(),[k](K& v){return std::pow(v,k );}); return *this;};
NDimTable& sqrt() {std::transform(this->begin(),this->end(),this->begin(),[ ](K& v){return std::sqrt(v );}); return *this;};
NDimTable& conj() {std::transform(this->begin(),this->end(),this->begin(),[ ](K& v){return std::conj(v );}); return *this;};
NDimTable& abs() {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[ ](K& v){return std::abs(v );}); return *this;};
NDimTable& pow(const K& k) {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[k](K& v){return std::pow(v,k );}); return *this;};
NDimTable& sqrt() {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[ ](K& v){return std::sqrt(v );}); return *this;};
NDimTable& conj() {__gnu_parallel::transform(this->begin(),this->end(),this->begin(),[ ](K& v){return std::conj(v );}); return *this;};

template<typename L> NDimTable& mult2Add(const NDimTable<L>& T,const K& k)
{std::transform(this->begin(),this->end(),T.begin(),this->begin(),[k](K& v,const L& l){return v+l*k;});return *this;};
{__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[k](K& v,const L& l){return v+l*k;});return *this;};
template<typename L> NDimTable& mult2Sub(const NDimTable<L>& T,const K& k)
{std::transform(this->begin(),this->end(),T.begin(),this->begin(),[k](K& v,const L& l){return v-l*k;});return *this;};
{__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[k](K& v,const L& l){return v-l*k;});return *this;};
template<typename L> NDimTable& mult1Sub(const K& k,const NDimTable<L>& T)
{std::transform(this->begin(),this->end(),T.begin(),this->begin(),[k](K& v,const L& l){return v*k-l;});return *this;};
{__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[k](K& v,const L& l){return v*k-l;});return *this;};
template<typename L> NDimTable& multMult(const NDimTable<L>& T,const K& k)
{std::transform(this->begin(),this->end(),T.begin(),this->begin(),[k](K& v,const L& l){return v*l*k;});return *this;};
{__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[k](K& v,const L& l){return v*l*k;});return *this;};
template<typename L> NDimTable& mult1Mult2Add(const K& k1,const NDimTable<L>& T,const K& k2)
{std::transform(this->begin(),this->end(),T.begin(),this->begin(),[k1,k2](K& v,const L& l){return v*k1+l*k2;});return *this;};
{__gnu_parallel::transform(this->begin(),this->end(),T.begin(),this->begin(),[k1,k2](K& v,const L& l){return v*k1+l*k2;});return *this;};

// // contractions (returns new container of different dimension, or works on a provided container of expected dimension)
// //
Expand Down

0 comments on commit 0a5694c

Please sign in to comment.