Index: mbdyn/base/socketstream_out_elem.cc
===================================================================
RCS file: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/base/socketstream_out_elem.cc,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- mbdyn/base/socketstream_out_elem.cc	13 Feb 2010 00:00:29 -0000	1.51
+++ mbdyn/base/socketstream_out_elem.cc	18 Jul 2010 01:50:14 -0000	1.52
@@ -132,8 +132,14 @@
 		SimulationEntity::Hints *ph)
 {
 	if (bSendFirst) {
+		// output imposed values (before "derivatives")
+		OutputCounter = OutputEvery - 1;
+
 		AfterConvergence(X, XP);
 	}
+
+	// do not send "derivatives"
+	OutputCounter = -1;
 }
 
 void
Index: mbdyn/base/socketstreamdrive.cc
===================================================================
RCS file: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/base/socketstreamdrive.cc,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- mbdyn/base/socketstreamdrive.cc	13 Feb 2010 00:00:29 -0000	1.47
+++ mbdyn/base/socketstreamdrive.cc	18 Jul 2010 01:50:14 -0000	1.48
@@ -76,18 +76,30 @@
 		const DriveHandler* pDH,
 		UseSocket *pUS, bool c,
 		const std::string& sFileName,
-		integer nd, unsigned int ie,
+		integer nd, unsigned int ie, bool bReceiveFirst,
 		int flags,
 		const struct timeval& st,
 		const std::string& sOutFileName, int iPrecision,
 		doublereal dShift)
 : StreamDrive(uL, pDH, sFileName, nd, c),
-InputEvery(ie), InputCounter(0), pUS(pUS), recv_flags(flags),
+InputEvery(ie), bReceiveFirst(bReceiveFirst), InputCounter(ie - 1),
+pUS(pUS), recv_flags(flags),
 SocketTimeout(st),
 sOutFileName(sOutFileName), iPrecision(iPrecision), dShift(dShift)
 {
+	// NOTE: InputCounter is set to InputEvery - 1 so that input
+	// is expected at initialization (initial time) and then every
+	// InputEvery steps; for example, for InputEvery == 4, input
+	// is expected at:
+	//	initial time
+	//	initial time + 4 * timestep
+	//	initial time + 8 * timestep
 	ASSERT(InputEvery > 0);
 
+	if (!bReceiveFirst) {
+		InputCounter -= InputEvery;
+	}
+
 	if (!sOutFileName.empty()) {
 		outFile.open(sOutFileName.c_str());
 		if (!outFile) {
@@ -461,6 +473,18 @@
 		InputEvery = (unsigned int)i;
 	}
 
+	bool bReceiveFirst(true);
+	if (HP.IsKeyWord("receive" "first")) {
+		if (!HP.GetYesNo(bReceiveFirst)) {
+			silent_cerr("SocketStreamDrive"
+				"(" << uLabel << ", \"" << name << "\"): "
+				"\"receive first\" must be either \"yes\" or \"no\" "
+				<< "at line " << HP.GetLineData()
+				<< std::endl);
+			throw ErrGeneric(MBDYN_EXCEPT_ARGS);
+		}
+	}
+
 	struct timeval SocketTimeout = { 0, 0 };
 	if (HP.IsKeyWord("timeout")) {
 		doublereal st = HP.GetReal();
@@ -546,7 +570,7 @@
 	SAFENEWWITHCONSTRUCTOR(pDr, SocketStreamDrive,
 		SocketStreamDrive(uLabel,
 			pDM->pGetDrvHdl(), pUS, create,
-			name, idrives, InputEvery,
+			name, idrives, InputEvery, bReceiveFirst,
 			flags, SocketTimeout,
 			sOutFileName, iPrecision, dShift));
 
Index: mbdyn/base/socketstreamdrive.h
===================================================================
RCS file: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/base/socketstreamdrive.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- mbdyn/base/socketstreamdrive.h	13 Feb 2010 00:00:29 -0000	1.21
+++ mbdyn/base/socketstreamdrive.h	18 Jul 2010 01:50:14 -0000	1.22
@@ -47,6 +47,7 @@
 class SocketStreamDrive : public StreamDrive {
 protected:
 	unsigned int InputEvery;
+	bool bReceiveFirst;
 	unsigned int InputCounter;
 
 	UseSocket *pUS;
@@ -63,7 +64,7 @@
 		const DriveHandler* pDH,
 		UseSocket *pUS, bool c,
 		const std::string& sFileName,
-		integer nd, unsigned int ie,
+		integer nd, unsigned int ie, bool bReceiveFirst,
 		int flags,
 		const struct timeval& st,
 		const std::string& sOutFileName, int iPrecision,

