--- Begin Message ---
Source: yade
Version: 1.20.0-7
Hi Maintainer
Yade FTBFS with glibc 2.23 available in Experimental and Ubuntu Xenial.
I was able to get yade to build in Ubuntu with the attached patch.
There are other occurrences of 'isnan' and 'isinf' inside #ifdefs that I
did not replace.
I don't know if it would be better to just search & replace inside all
files, or whether there is a simpler way to fix this.
Regards
Graham
[1]
https://launchpad.net/ubuntu/+archive/test-rebuild-20160401/+build/9526535/+files/buildlog_ubuntu-xenial-amd64.yade_1.20.0-7_BUILDING.txt.gz
--- a/gui/qt5/GLViewer.cpp
+++ b/gui/qt5/GLViewer.cpp
@@ -350,7 +350,7 @@
if(not(rb->bound)){ rb->updateBound();}
min=rb->bound->min; max=rb->bound->max;
- bool hasNan=(isnan(min[0])||isnan(min[1])||isnan(min[2])||isnan(max[0])||isnan(max[1])||isnan(max[2]));
+ bool hasNan=(std::isnan(min[0])||std::isnan(min[1])||std::isnan(min[2])||std::isnan(max[0])||std::isnan(max[1])||std::isnan(max[2]));
Real minDim=std::min(max[0]-min[0],std::min(max[1]-min[1],max[2]-min[2]));
if(minDim<=0 || hasNan){
// Aabb is not yet calculated...
@@ -362,7 +362,7 @@
max=max.cwiseMax(b->state->pos);
min=min.cwiseMin(b->state->pos);
}
- if(isinf(min[0])||isinf(min[1])||isinf(min[2])||isinf(max[0])||isinf(max[1])||isinf(max[2])){ LOG_DEBUG("No min/max computed from bodies either, setting cube (-1,-1,-1)Ã(1,1,1)"); min=-Vector3r::Ones(); max=Vector3r::Ones(); }
+ if(std::isinf(min[0])||std::isinf(min[1])||std::isinf(min[2])||std::isinf(max[0])||std::isinf(max[1])||std::isinf(max[2])){ LOG_DEBUG("No min/max computed from bodies either, setting cube (-1,-1,-1)Ã(1,1,1)"); min=-Vector3r::Ones(); max=Vector3r::Ones(); }
} else {LOG_DEBUG("Using scene's Aabb");}
LOG_DEBUG("Got scene box min="<<min<<" and max="<<max);
--- a/pkg/common/Cylinder.cpp
+++ b/pkg/common/Cylinder.cpp
@@ -450,7 +450,7 @@
ChainedCylinder *cc1=static_cast<ChainedCylinder*>(cm1.get());
ChainedCylinder *cc2=static_cast<ChainedCylinder*>(cm2.get());
- if(isnan(dist)){ //now if we didn't found a suitable distance because the segments don't cross each other, we try to find a sphere-cylinder distance.
+ if(std::isnan(dist)){ //now if we didn't found a suitable distance because the segments don't cross each other, we try to find a sphere-cylinder distance.
Vector3r pointsToCheck[4]={A,A+a,B,B+b}; Real resultDist=dist, resultProj=dist ; int whichCaseIsCloser=-1 ;
for (int i=0;i<4;i++){ //loop on the 4 cylinder's extremities and look at the extremity-cylinder distance
Vector3r S=pointsToCheck[i], C=(i<2)?B:A, vec=(i<2)?b:a; Vector3r CS=S-C;
@@ -458,7 +458,7 @@
if(d<0.) resultDist=CS.norm();
else if(d>vec.norm()) resultDist=(C+vec-S).norm();
else resultDist=(CS.cross(vec)).norm()/(vec.norm());
- if(dist>resultDist or isnan(dist)){dist=resultDist ; whichCaseIsCloser=i; resultProj=d;}
+ if(dist>resultDist or std::isnan(dist)){dist=resultDist ; whichCaseIsCloser=i; resultProj=d;}
}
//we know which extremity may be in contact (i), so k and m are computed to generate the right fictiousStates.
insideCyl1=1 ; insideCyl2=1;
--- a/pkg/common/ZECollider.cpp
+++ b/pkg/common/ZECollider.cpp
@@ -68,7 +68,7 @@
minR=min(s->radius,minR);
}
// if no spheres, disable stride
- verletDist=isinf(minR) ? 0 : std::abs(verletDist)*minR;
+ verletDist=std::isinf(minR) ? 0 : std::abs(verletDist)*minR;
}
// update bounds via boundDispatcher
--- a/pkg/common/MatchMaker.cpp
+++ b/pkg/common/MatchMaker.cpp
@@ -9,7 +9,7 @@
if(((int)m[0]==id1 && (int)m[1]==id2) || ((int)m[0]==id2 && (int)m[1]==id1)) return m[2];
}
// no match
- if(fbNeedsValues && (isnan(val1) || isnan(val2))) throw std::invalid_argument("MatchMaker: no match for ("+boost::lexical_cast<string>(id1)+","+boost::lexical_cast<string>(id2)+"), and values required for algo computation '"+algo+"' not specified.");
+ if(fbNeedsValues && (std::isnan(val1) || std::isnan(val2))) throw std::invalid_argument("MatchMaker: no match for ("+boost::lexical_cast<string>(id1)+","+boost::lexical_cast<string>(id2)+"), and values required for algo computation '"+algo+"' not specified.");
return computeFallback(val1,val2);
}
--- a/pkg/common/Gl1_NormPhys.cpp
+++ b/pkg/common/Gl1_NormPhys.cpp
@@ -34,7 +34,7 @@
fnNorm=std::abs(fnNorm);
Real radiusScale=1.;
// weak/strong fabric, only used if maxWeakFn is set
- if(!isnan(maxWeakFn)){
+ if(!std::isnan(maxWeakFn)){
if(fnNorm*fnSign<maxWeakFn){ // weak fabric
if(weakFilter>0) return;
radiusScale=weakScale;
--- a/pkg/common/InsertionSortCollider.cpp
+++ b/pkg/common/InsertionSortCollider.cpp
@@ -241,9 +241,9 @@
if(!s) continue;
minR=min(s->radius,minR);
}
- if (isinf(minR)) LOG_ERROR("verletDist is set to 0 because no spheres were found. It will result in suboptimal performances, consider setting a positive verletDist in your script.");
+ if (std::isinf(minR)) LOG_ERROR("verletDist is set to 0 because no spheres were found. It will result in suboptimal performances, consider setting a positive verletDist in your script.");
// if no spheres, disable stride
- verletDist=isinf(minR) ? 0 : std::abs(verletDist)*minR;
+ verletDist=std::isinf(minR) ? 0 : std::abs(verletDist)*minR;
}
// if interactions are dirty, force reinitialization
if(scene->interactions->dirty){
--- a/pkg/common/Facet.cpp
+++ b/pkg/common/Facet.cpp
@@ -20,7 +20,7 @@
// in the future, a fixed-size array should be used instead of vector<Vector3r> for vertices
// this is prevented by yade::serialization now IIRC
if(vertices.size()!=3){ throw runtime_error(("Facet must have exactly 3 vertices (not "+boost::lexical_cast<string>(vertices.size())+")").c_str()); }
- if(isnan(vertices[0][0])) return; // not initialized, nothing to do
+ if(std::isnan(vertices[0][0])) return; // not initialized, nothing to do
Vector3r e[3] = {vertices[1]-vertices[0] ,vertices[2]-vertices[1] ,vertices[0]-vertices[2]};
#define CHECK_EDGE(i) if(e[i].squaredNorm()==0){LOG_FATAL("Facet has coincident vertices "<<i<<" ("<<vertices[i]<<") and "<<(i+1)%3<<" ("<<vertices[(i+1)%3]<<")!");}
CHECK_EDGE(0); CHECK_EDGE(1);CHECK_EDGE(2);
--- a/pkg/dem/NewtonIntegrator.cpp
+++ b/pkg/dem/NewtonIntegrator.cpp
@@ -102,7 +102,7 @@
// its velocity will count as max velocity of bodies
// otherwise the collider might not run if only the cell were changing without any particle motion
// FIXME: will not work for pure shear transformation, which does not change Cell::getSize()
- if(scene->isPeriodic && ((prevCellSize!=scene->cell->getSize())) && /* initial value */!isnan(prevCellSize[0]) ){ cellChanged=true; maxVelocitySq=(prevCellSize-scene->cell->getSize()).squaredNorm()/pow(dt,2); }
+ if(scene->isPeriodic && ((prevCellSize!=scene->cell->getSize())) && /* initial value */!std::isnan(prevCellSize[0]) ){ cellChanged=true; maxVelocitySq=(prevCellSize-scene->cell->getSize()).squaredNorm()/pow(dt,2); }
else { maxVelocitySq=0; cellChanged=false; }
#ifdef YADE_BODY_CALLBACK
--- a/lib/triangulation/FlowBoundingSphere.ipp
+++ b/lib/triangulation/FlowBoundingSphere.ipp
@@ -895,7 +895,7 @@
} else {
/// INCOMPRESSIBLE
m += (cell->info().kNorm())[j2] * cell->neighbor(j2)->info().p();
- if ( isinf(m) && j<10 ) cout << "(cell->info().kNorm())[j2] = " << (cell->info().kNorm())[j2] << " cell->neighbor(j2)->info().p() = " << cell->neighbor(j2)->info().p() << endl;
+ if ( std::isinf(m) && j<10 ) cout << "(cell->info().kNorm())[j2] = " << (cell->info().kNorm())[j2] << " cell->neighbor(j2)->info().p() = " << cell->neighbor(j2)->info().p() << endl;
if (j==0) n += (cell->info().kNorm())[j2];
}
}
--- a/lib/triangulation/PeriodicFlow.hpp
+++ b/lib/triangulation/PeriodicFlow.hpp
@@ -406,7 +406,7 @@
if (j==0) n += compFlowFactor*(cell->info().kNorm())[j2];
} else {
m += (cell->info().kNorm())[j2]*cell->neighbor(j2)->info().shiftedP();
- if ( isinf(m) && j<10 ) cout << "(cell->info().kNorm())[j2] = " << (cell->info().kNorm())[j2] << " cell->neighbor(j2)->info().shiftedP() = " << cell->neighbor(j2)->info().shiftedP() << endl;
+ if ( std::isinf(m) && j<10 ) cout << "(cell->info().kNorm())[j2] = " << (cell->info().kNorm())[j2] << " cell->neighbor(j2)->info().shiftedP() = " << cell->neighbor(j2)->info().shiftedP() << endl;
if (j==0) n += (cell->info().kNorm())[j2];
}
}
--- a/pkg/dem/GeneralIntegratorInsertionSortCollider.cpp
+++ b/pkg/dem/GeneralIntegratorInsertionSortCollider.cpp
@@ -86,9 +86,9 @@
if(!s) continue;
minR=min(s->radius,minR);
}
- if (isinf(minR)) LOG_ERROR("verletDist is set to 0 because no spheres were found. It will result in suboptimal performances, consider setting a positive verletDist in your script.");
+ if (std::isinf(minR)) LOG_ERROR("verletDist is set to 0 because no spheres were found. It will result in suboptimal performances, consider setting a positive verletDist in your script.");
// if no spheres, disable stride
- verletDist=isinf(minR) ? 0 : std::abs(verletDist)*minR;
+ verletDist=std::isinf(minR) ? 0 : std::abs(verletDist)*minR;
}
// update bounds via boundDispatcher
--- a/pkg/dem/UniaxialStrainer.cpp
+++ b/pkg/dem/UniaxialStrainer.cpp
@@ -38,13 +38,13 @@
if(originalLength<=0) throw runtime_error(("UniaxialStrainer: Initial length is negative or zero (swapped reference particles?)! "+boost::lexical_cast<string>(originalLength)).c_str());
/* this happens is nan propagates from e.g. brefcom consitutive law in case 2 bodies have _exactly_ the same position
* (the the normal strain is 0./0.=nan). That is an user's error, however and should not happen. */
- if(isnan(originalLength)) throw logic_error("UniaxialStrainer: Initial length is NaN!");
- assert(originalLength>0 && !isnan(originalLength));
+ if(std::isnan(originalLength)) throw logic_error("UniaxialStrainer: Initial length is NaN!");
+ assert(originalLength>0 && !std::isnan(originalLength));
- assert(!isnan(strainRate) || !isnan(absSpeed));
- if(!isnan(std::numeric_limits<Real>::quiet_NaN())){ throw runtime_error("UniaxialStrainer: NaN's are not properly supported (compiled with -ffast-math?), which is required."); }
+ assert(!std::isnan(strainRate) || !std::isnan(absSpeed));
+ if(!std::isnan(std::numeric_limits<Real>::quiet_NaN())){ throw runtime_error("UniaxialStrainer: NaN's are not properly supported (compiled with -ffast-math?), which is required."); }
- if(isnan(strainRate)){ strainRate=absSpeed/originalLength; LOG_INFO("Computed new strainRate "<<strainRate); }
+ if(std::isnan(strainRate)){ strainRate=absSpeed/originalLength; LOG_INFO("Computed new strainRate "<<strainRate); }
else {absSpeed=strainRate*originalLength;}
if(!setSpeeds){
@@ -77,7 +77,7 @@
b->state->vel[axis]=pNormalized*(v1-v0)+v0;
}
}
- if(isnan(crossSectionArea)){ throw std::invalid_argument("UniaxialStrain.crossSectionArea must be specified."); }
+ if(std::isnan(crossSectionArea)){ throw std::invalid_argument("UniaxialStrain.crossSectionArea must be specified."); }
}
void UniaxialStrainer::action(){
@@ -93,7 +93,7 @@
} else currentStrainRate=strainRate;
// how much do we move (in total, symmetry handled below)
Real dAX=currentStrainRate*originalLength*scene->dt;
- if(!isnan(stopStrain)){
+ if(!std::isnan(stopStrain)){
Real axialLength=axisCoord(posIds[0])-axisCoord(negIds[0]);
Real newStrain=(axialLength+dAX)/originalLength-1;
if((newStrain*stopStrain>0) && std::abs(newStrain)>=stopStrain){ // same sign of newStrain and stopStrain && over the limit from below in abs values
--- a/pkg/dem/Polyhedra_Ig2.cpp
+++ b/pkg/dem/Polyhedra_Ig2.cpp
@@ -64,7 +64,7 @@
Real volume;
Vector3r centroid;
P_volume_centroid(Int, &volume, ¢roid);
- if(isnan(volume) || volume<=1E-25 || volume > min(A->GetVolume(),B->GetVolume())) {
+ if(std::isnan(volume) || volume<=1E-25 || volume > min(A->GetVolume(),B->GetVolume())) {
bang->equivalentPenetrationDepth=0;
bang->penetrationVolume=min(A->GetVolume(),B->GetVolume());
bang->normal = (A->GetVolume()>B->GetVolume() ? 1 : -1)*(se32.position+shift2-se31.position);
@@ -155,7 +155,7 @@
Real volume;
Vector3r centroid;
P_volume_centroid(Int, &volume, ¢roid);
- if(isnan(volume) || volume<=1E-25 || volume > B->GetVolume()) {bang->equivalentPenetrationDepth=0; return true;}
+ if(std::isnan(volume) || volume<=1E-25 || volume > B->GetVolume()) {bang->equivalentPenetrationDepth=0; return true;}
if (!Is_inside_Polyhedron(PB, ToCGALPoint(centroid))) {bang->equivalentPenetrationDepth=0; return true;}
//calculate area of projection of Intersection into the normal plane
@@ -250,7 +250,7 @@
Real volume;
Vector3r centroid;
P_volume_centroid(Int, &volume, ¢roid);
- if(isnan(volume) || volume<=1E-25 || volume > B->GetVolume()) {bang->equivalentPenetrationDepth=0; return true;}
+ if(std::isnan(volume) || volume<=1E-25 || volume > B->GetVolume()) {bang->equivalentPenetrationDepth=0; return true;}
if (!Is_inside_Polyhedron(PB, ToCGALPoint(centroid))) {bang->equivalentPenetrationDepth=0; return true;}
//find normal direction
--- a/pkg/dem/ScGeom.cpp
+++ b/pkg/dem/ScGeom.cpp
@@ -104,7 +104,7 @@
// add -DYADE_SCGEOM_DEBUG to CXXFLAGS to enable this piece or just do
// #define YADE_SCGEOM_DEBUG //(but do not commit with that enabled in the code)
#ifdef YADE_SCGEOM_DEBUG
- if (isnan(aa.angle())) {
+ if (std::isnan(aa.angle())) {
cerr<<"NaN angle found in angleAxisr(q), for quaternion "<<delta<<", after quaternion product"<<endl;
cerr<<"rbp1.ori * (initialOrientation1.conjugate())) * (initialOrientation2 * (rbp2.ori.conjugate()) with quaternions :"<<endl;
cerr<<rbp1.ori<<" * "<<initialOrientation1<<" * "<<initialOrientation2<<" * "<<rbp2.ori<<endl<<" and sub-products :"<<endl<<rbp1.ori * (initialOrientation1.conjugate())<<" * "<<initialOrientation2 * (rbp2.ori.conjugate())<<endl;
@@ -115,7 +115,7 @@
cerr<<delta<<" "<<bb.angle()<<endl;
}
#else
- if (isnan(aa.angle())) aa.angle()=0;
+ if (std::isnan(aa.angle())) aa.angle()=0;
#endif
if (aa.angle() > Mathr::PI) aa.angle() -= Mathr::TWO_PI; // angle is between 0 and 2*pi, but should be between -pi and pi
twist = (aa.angle() * aa.axis().dot(normal));
--- a/pkg/dem/Shop_02.cpp
+++ b/pkg/dem/Shop_02.cpp
@@ -87,7 +87,7 @@
else theta=0;
Real hRef=dH_dTheta*(theta-theta0);
long period;
- if(isnan(periodStart)){
+ if(std::isnan(periodStart)){
Real h=Shop::periodicWrap(pt[axis]-hRef,hRef-Mathr::PI*dH_dTheta,hRef+Mathr::PI*dH_dTheta,&period);
return boost::make_tuple(r,h,theta);
}
@@ -238,7 +238,7 @@
Real N=(compressionPositive?-1:1)*phys->normalForce.dot(n);
// Real R=(Body::byId(I->getId2(),scene)->state->pos+cellHsize*I->cellDist.cast<Real>()-Body::byId(I->getId1(),scene)->state->pos).norm();
Real R=.5*(geom->refR1+geom->refR2);
- Real Fsplit=(!isnan(thresholdForce))?thresholdForce:Fmean;
+ Real Fsplit=(!std::isnan(thresholdForce))?thresholdForce:Fmean;
if (compressionPositive?(N<Fsplit):(N>Fsplit)){
for(int i=0; i<3; i++) for(int j=i; j<3; j++){
sigNStrong(i,j)+=R*N*n[i]*n[j];}
@@ -304,7 +304,7 @@
fabricStrong=Matrix3r::Zero();
fabricWeak=Matrix3r::Zero();
int nStrong(0), nWeak(0); // number of strong and weak contacts respectively
- if (!splitTensor & !isnan(thresholdForce)) {LOG_WARN("The bool splitTensor should be set to True if you specified a threshold value for the contact force, otherwise the function will return only the fabric tensor and not the two separate contributions.");}
+ if (!splitTensor & !std::isnan(thresholdForce)) {LOG_WARN("The bool splitTensor should be set to True if you specified a threshold value for the contact force, otherwise the function will return only the fabric tensor and not the two separate contributions.");}
FOREACH(const shared_ptr<Interaction>& I, *scene->interactions){
if(!I->isReal()) continue;
GenericSpheresContact* geom=YADE_CAST<GenericSpheresContact*>(I->geom.get());
@@ -312,7 +312,7 @@
const Vector3r& n=geom->normal;
Real f=(revertSign?-1:1)*phys->normalForce.dot(n);
// slipt the tensor according to the mean contact force or a threshold value if this is given
- Real Fsplit=(!isnan(thresholdForce))?thresholdForce:Fmean;
+ Real Fsplit=(!std::isnan(thresholdForce))?thresholdForce:Fmean;
if (revertSign?(f<Fsplit):(f>Fsplit)){ // reminder: forces are compared with their sign
for(int i=0; i<3; i++) for(int j=i; j<3; j++){
fabricStrong(i,j)+=n[i]*n[j];
--- a/pkg/dem/ConcretePM.cpp
+++ b/pkg/dem/ConcretePM.cpp
@@ -43,14 +43,14 @@
// check unassigned values
if (!mat1->neverDamage) {
- assert(!isnan(mat1->sigmaT));
- assert(!isnan(mat1->epsCrackOnset));
- assert(!isnan(mat1->relDuctility));
+ assert(!std::isnan(mat1->sigmaT));
+ assert(!std::isnan(mat1->epsCrackOnset));
+ assert(!std::isnan(mat1->relDuctility));
}
if (!mat2->neverDamage) {
- assert(!isnan(mat2->sigmaT));
- assert(!isnan(mat2->epsCrackOnset));
- assert(!isnan(mat2->relDuctility));
+ assert(!std::isnan(mat2->sigmaT));
+ assert(!std::isnan(mat2->epsCrackOnset));
+ assert(!std::isnan(mat2->relDuctility));
}
cpmPhys->damLaw = mat1->damLaw;
@@ -273,7 +273,7 @@
#ifdef YADE_DEBUG
#define CPM_YADE_DEBUG_A \
- if(isnan(epsN)){\
+ if(std::isnan(epsN)){\
/*LOG_FATAL("refLength="<<geom->refLength<<"; pos1="<<geom->se31.position<<"; pos2="<<geom->se32.position<<"; displacementN="<<geom->displacementN());*/ \
throw runtime_error("!! epsN==NaN !!");\
}
@@ -283,8 +283,8 @@
#define YADE_VERIFY(condition) if(!(condition)){LOG_FATAL("Verification `"<<#condition<<"' failed!"); LOG_FATAL("in interaction #"<<I->getId1()<<"+#"<<I->getId2()); Omega::instance().saveSimulation("/tmp/verificationFailed.xml"); throw;}
-#define NNAN(a) YADE_VERIFY(!isnan(a));
-#define NNANV(v) YADE_VERIFY(!isnan(v[0])); assert(!isnan(v[1])); assert(!isnan(v[2]));
+#define NNAN(a) YADE_VERIFY(!std::isnan(a));
+#define NNANV(v) YADE_VERIFY(!std::isnan(v[0])); assert(!std::isnan(v[1])); assert(!std::isnan(v[2]));
bool Law2_ScGeom_CpmPhys_Cpm::go(shared_ptr<IGeom>& _geom, shared_ptr<IPhys>& _phys, Interaction* I){
TIMING_DELTAS_START();
--- a/pkg/dem/PeriIsoCompressor.cpp
+++ b/pkg/dem/PeriIsoCompressor.cpp
@@ -154,7 +154,7 @@
if(doUpdate || min(stiff[0],min(stiff[1],stiff[2])) <=0 || dynCell){ strainStressStiffUpdate(); }
// set mass to be sum of masses, if not set by the user
- if(dynCell && isnan(mass)){
+ if(dynCell && std::isnan(mass)){
mass=0; FOREACH(const shared_ptr<Body>& b, *scene->bodies){ if(b && b->state) mass+=b->state->mass; }
LOG_INFO("Setting cell mass to "<<mass<<" automatically.");}
bool allOk=true;
--- End Message ---