Index: mbdyn/base/solver.cc
===================================================================
RCS file: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/base/solver.cc,v
retrieving revision 1.222
retrieving revision 1.223
diff -u -r1.222 -r1.223
--- mbdyn/base/solver.cc	16 Apr 2010 19:49:37 -0000	1.222
+++ mbdyn/base/solver.cc	22 Jun 2010 16:45:11 -0000	1.223
@@ -64,6 +64,7 @@
 #include <cfloat>
 #include <cmath>
 #include <vector>
+#include <algorithm>
 #include "ac/sys_sysinfo.h"
 
 #include "solver.h"
@@ -814,13 +815,20 @@
 	dTime = dInitialTime;
 	pDM->SetTime(dTime, 0., 0);
 
+	EigAn.currAnalysis = std::find_if(EigAn.Analyses.begin(), EigAn.Analyses.end(),
+		bind2nd(std::greater<doublereal>(), dTime));
+	if (EigAn.currAnalysis != EigAn.Analyses.end() && EigAn.currAnalysis != EigAn.Analyses.begin()) {
+		EigAn.currAnalysis--;
+	}
 
 	if (EigAn.bAnalysis
-		&& EigAn.OneAnalysis.dTime <= dTime
-		&& !EigAn.OneAnalysis.bDone)
+		&& EigAn.currAnalysis != EigAn.Analyses.end()
+		&& *EigAn.currAnalysis <= dTime)
 	{
 		Eig();
-		EigAn.OneAnalysis.bDone = true;
+		if (EigAn.currAnalysis != EigAn.Analyses.end()) {
+			EigAn.currAnalysis++;
+		}
 	}
 
 	integer iTotIter = 0;
@@ -1328,11 +1336,17 @@
 	iTotIter += iStIter;
 
 	if (EigAn.bAnalysis
-		&& EigAn.OneAnalysis.dTime <= dTime
-		&& !EigAn.OneAnalysis.bDone)
+		&& EigAn.currAnalysis != EigAn.Analyses.end()
+		&& *EigAn.currAnalysis <= dTime)
 	{
+		std::vector<doublereal>::iterator i = std::find_if(EigAn.Analyses.begin(),
+			EigAn.Analyses.end(), bind2nd(std::greater<doublereal>(), dTime));
+		if (i != EigAn.Analyses.end()) {
+			i--;
+			EigAn.currAnalysis = i;
+		}
 		Eig();
-		EigAn.OneAnalysis.bDone = true;
+		EigAn.currAnalysis++;
 	}
 
 	if (pRTSolver) {
@@ -1547,11 +1561,17 @@
 		bSolConv = false;
 
 		if (EigAn.bAnalysis
-			&& EigAn.OneAnalysis.dTime <= dTime
-			&& !EigAn.OneAnalysis.bDone)
+			&& EigAn.currAnalysis != EigAn.Analyses.end()
+			&& *EigAn.currAnalysis <= dTime)
 		{
+			std::vector<doublereal>::iterator i = std::find_if(EigAn.Analyses.begin(),
+				EigAn.Analyses.end(), bind2nd(std::greater<doublereal>(), dTime));
+			if (i != EigAn.Analyses.end()) {
+				i--;
+				EigAn.currAnalysis = i;
+			}
 			Eig();
-			EigAn.OneAnalysis.bDone = true;
+			EigAn.currAnalysis++;
 		}
 
 		/* Calcola il nuovo timestep */
@@ -2922,10 +2942,35 @@
 		case EIGENANALYSIS:
 #ifdef USE_EIG
 			// read eigenanalysis time (to be changed)
-			EigAn.OneAnalysis.dTime = HP.GetReal();
+			if (HP.IsKeyWord("list")) {
+				int iNumTimes = HP.GetInt();
+				if (iNumTimes <= 0) {
+					silent_cerr("invalid number of eigenanalysis times "
+						"at line " << HP.GetLineData()
+						<< std::endl);
+					throw ErrGeneric(MBDYN_EXCEPT_ARGS);
+				}
+
+				EigAn.Analyses.resize(iNumTimes);
+				for (std::vector<doublereal>::iterator i = EigAn.Analyses.begin();
+					i != EigAn.Analyses.end(); i++)
+				{
+					*i = HP.GetReal();
+					if (i > EigAn.Analyses.begin() && *i <= *(i-1)) {
+						silent_cerr("eigenanalysis times must be in strict ascending order "
+							"at line " << HP.GetLineData()
+							<< std::endl);
+						throw ErrGeneric(MBDYN_EXCEPT_ARGS);
+					}
+				}
+
+			} else {
+				EigAn.Analyses.resize(1);
+				EigAn.Analyses[0] = HP.GetReal();
+			}
 
 			// initialize EigAn
-			EigAn.OneAnalysis.bDone = false;
+			EigAn.currAnalysis = EigAn.Analyses.begin();
 			EigAn.bAnalysis = true;
 
 			// permute is the default; use "balance, no" to disable
@@ -4973,11 +5018,25 @@
 			tmpFileName = sOutputFileName;
 		}
 
+		unsigned uSize = EigAn.Analyses.size();
+		if (uSize > 1) {
+			unsigned uCurr = EigAn.currAnalysis - EigAn.Analyses.begin();
+			int iLength = 1 + (int)log10(uSize - 1);
+
+			char buf[BUFSIZ];
+			snprintf(buf, sizeof(buf), ".%0*u", iLength, uCurr);
+			tmpFileName += buf;
+		}
+
 		tmpFileName += ".m";
 		o.open(tmpFileName.c_str());
 
 		o.setf(std::ios::right | std::ios::scientific);
 		o.precision(16);
+
+		// header
+		o
+			<< "% time: " << dTime << std::endl;
 
 		/* coefficient */
 		o
Index: mbdyn/base/solver.h
===================================================================
RCS file: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/base/solver.h,v
retrieving revision 1.75
retrieving revision 1.77
diff -u -r1.75 -r1.77
--- mbdyn/base/solver.h	8 Apr 2010 18:31:53 -0000	1.75
+++ mbdyn/base/solver.h	22 Jun 2010 16:45:12 -0000	1.77
@@ -155,10 +155,9 @@
 			EIG_LAST
 		};
 		unsigned uFlags;
-   		struct {
-     	 		doublereal dTime;
-      			bool bDone;
-	   	} OneAnalysis;
+		std::vector<doublereal> Analyses;
+		std::vector<doublereal>::iterator currAnalysis;
+
 		doublereal dParam;
 		bool bOutputModes;
 

