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, &centroid);
- 	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, &centroid);
-	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, &centroid);
- 	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;
-- 
debian-science-maintainers mailing list
debian-science-maintainers@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-science-maintainers

Reply via email to