Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 9375)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 9376)
@@ -5184,9 +5184,9 @@
 
 	/*Control Inputs*/
-	if (control_analysis && iomodel->f(ControlTypeEnum)){
+	if (control_analysis && iomodel->IsLoaded(ControlTypeEnum)){
 		for(i=0;i<num_control_type;i++){
 			switch((int)iomodel->f(ControlTypeEnum)[i]){
 				case DhdtEnum:
-					if (iomodel->f(DhdtEnum)){
+					if (iomodel->IsLoaded(DhdtEnum)){
 						for(j=0;j<6;j++)nodeinputs[j]=iomodel->f(DhdtEnum)[penta_vertex_ids[j]-1]/yts;
 						for(j=0;j<6;j++)cmmininputs[j]=iomodel->f(CmMinEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
@@ -5196,5 +5196,5 @@
 					break;
 				case VxEnum:
-					if (iomodel->f(VxEnum)){
+					if (iomodel->IsLoaded(VxEnum)){
 						for(j=0;j<6;j++)nodeinputs[j]=iomodel->f(VxEnum)[penta_vertex_ids[j]-1]/yts;
 						for(j=0;j<6;j++)cmmininputs[j]=iomodel->f(CmMinEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
@@ -5204,5 +5204,5 @@
 					break;
 				case VyEnum:
-					if (iomodel->f(VyEnum)){
+					if (iomodel->IsLoaded(VyEnum)){
 						for(j=0;j<6;j++)nodeinputs[j]=iomodel->f(VyEnum)[penta_vertex_ids[j]-1]/yts;
 						for(j=0;j<6;j++)cmmininputs[j]=iomodel->f(CmMinEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts;
@@ -5212,5 +5212,5 @@
 					break;
 				case DragCoefficientEnum:
-					if (iomodel->f(DragCoefficientEnum)){
+					if (iomodel->IsLoaded(DragCoefficientEnum)){
 						for(j=0;j<6;j++)nodeinputs[j]=iomodel->f(DragCoefficientEnum)[penta_vertex_ids[j]-1];
 						for(j=0;j<6;j++)cmmininputs[j]=iomodel->f(CmMinEnum)[(penta_vertex_ids[j]-1)*num_control_type+i];
@@ -5228,5 +5228,5 @@
 
 	//Need to know the type of approximation for this element
-	if(iomodel->f(ElementsTypeEnum)){
+	if(iomodel->IsLoaded(ElementsTypeEnum)){
 		if (*(iomodel->f(ElementsTypeEnum)+index)==MacAyealApproximationEnum){
 			this->inputs->AddInput(new IntInput(ApproximationEnum,MacAyealApproximationEnum));
@@ -5259,5 +5259,5 @@
 
 	/*DatasetInputs*/
-	if (iomodel->f(WeightsEnum)) {
+	if (iomodel->IsLoaded(WeightsEnum)) {
 
 		/*Create inputs and add to DataSetInput*/
@@ -7569,5 +7569,5 @@
 			/*default vx,vy and vz: either observation or 0 */
 			if(!iomodel->f(VxEnum)){
-				if (iomodel->f(VxObsEnum)) for(i=0;i<6;i++)nodeinputs[i]=iomodel->f(VxObsEnum)[penta_vertex_ids[i]-1]/yts;
+				if (iomodel->IsLoaded(VxObsEnum)) for(i=0;i<6;i++)nodeinputs[i]=iomodel->f(VxObsEnum)[penta_vertex_ids[i]-1]/yts;
 				else                 for(i=0;i<6;i++)nodeinputs[i]=0;
 				this->inputs->AddInput(new PentaVertexInput(VxEnum,nodeinputs));
@@ -7576,5 +7576,5 @@
 			}
 			if(!iomodel->f(VyEnum)){
-				if (iomodel->f(VyObsEnum)) for(i=0;i<6;i++)nodeinputs[i]=iomodel->f(VyObsEnum)[penta_vertex_ids[i]-1]/yts;
+				if (iomodel->IsLoaded(VyObsEnum)) for(i=0;i<6;i++)nodeinputs[i]=iomodel->f(VyObsEnum)[penta_vertex_ids[i]-1]/yts;
 				else                 for(i=0;i<6;i++)nodeinputs[i]=0;
 				this->inputs->AddInput(new PentaVertexInput(VyEnum,nodeinputs));
@@ -7583,5 +7583,5 @@
 			}
 			if(!iomodel->f(VzEnum)){
-				if (iomodel->f(VzObsEnum)) for(i=0;i<6;i++)nodeinputs[i]=iomodel->f(VzObsEnum)[penta_vertex_ids[i]-1]/yts;
+				if (iomodel->IsLoaded(VzObsEnum)) for(i=0;i<6;i++)nodeinputs[i]=iomodel->f(VzObsEnum)[penta_vertex_ids[i]-1]/yts;
 				else                 for(i=0;i<6;i++)nodeinputs[i]=0;
 				this->inputs->AddInput(new PentaVertexInput(VzEnum,nodeinputs));
@@ -7602,5 +7602,5 @@
 			if(*(iomodel->f(ElementsTypeEnum)+index)==PattynStokesApproximationEnum){
 				/*Create VzPattyn and VzStokes Enums*/
-				if(iomodel->f(VzEnum) && iomodel->f(NodeOnStokesEnum)){
+				if(iomodel->IsLoaded(VzEnum) && iomodel->IsLoaded(NodeOnStokesEnum)){
 					for(i=0;i<6;i++) nodeinputs[i]=iomodel->f(VzEnum)[penta_vertex_ids[i]-1]/yts*iomodel->f(NodeOnStokesEnum)[penta_vertex_ids[i]-1];
 					this->inputs->AddInput(new PentaVertexInput(VzStokesEnum,nodeinputs));
@@ -7616,5 +7616,5 @@
 			if(*(iomodel->f(ElementsTypeEnum)+index)==MacAyealStokesApproximationEnum){
 				/*Create VzMacAyeal and VzStokes Enums*/
-				if(iomodel->f(VzEnum) && iomodel->f(NodeOnStokesEnum)){
+				if(iomodel->IsLoaded(VzEnum) && iomodel->IsLoaded(NodeOnStokesEnum)){
 					for(i=0;i<6;i++) nodeinputs[i]=iomodel->f(VzEnum)[penta_vertex_ids[i]-1]/yts*iomodel->f(NodeOnStokesEnum)[penta_vertex_ids[i]-1];
 					this->inputs->AddInput(new PentaVertexInput(VzStokesEnum,nodeinputs));
@@ -7644,5 +7644,5 @@
 			this->inputs->AddInput(new PentaVertexInput(VyMeshEnum,nodeinputs));
 			this->inputs->AddInput(new PentaVertexInput(VzMeshEnum,nodeinputs));
-			if (iomodel->f(TemperatureEnum) && iomodel->f(WaterfractionEnum)) {
+			if (iomodel->IsLoaded(TemperatureEnum) && iomodel->IsLoaded(WaterfractionEnum)) {
 				for(i=0;i<6;i++){
 					if(iomodel->f(TemperatureEnum)[penta_vertex_ids[i]-1] < meltingpoint-beta*iomodel->f(PressureEnum)[penta_vertex_ids[i]-1]){
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 9375)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 9376)
@@ -3288,9 +3288,9 @@
 
 	/*Control Inputs*/
-	if (control_analysis && iomodel->f(ControlTypeEnum)){
+	if (control_analysis && iomodel->IsLoaded(ControlTypeEnum)){
 		for(i=0;i<num_control_type;i++){
 			switch((int)iomodel->f(ControlTypeEnum)[i]){
 				case DhdtEnum:
-					if (iomodel->f(DhdtEnum)){
+					if (iomodel->IsLoaded(DhdtEnum)){
 						for(j=0;j<3;j++)nodeinputs[j]=iomodel->f(DhdtEnum)[tria_vertex_ids[j]-1]/yts;
 						for(j=0;j<3;j++)cmmininputs[j]=iomodel->f(CmMinEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
@@ -3300,5 +3300,5 @@
 					break;
 				case VxEnum:
-					if (iomodel->f(VxEnum)){
+					if (iomodel->IsLoaded(VxEnum)){
 						for(j=0;j<3;j++)nodeinputs[j]=iomodel->f(VxEnum)[tria_vertex_ids[j]-1]/yts;
 						for(j=0;j<3;j++)cmmininputs[j]=iomodel->f(CmMinEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
@@ -3308,5 +3308,5 @@
 					break;
 				case VyEnum:
-					if (iomodel->f(VyEnum)){
+					if (iomodel->IsLoaded(VyEnum)){
 						for(j=0;j<3;j++)nodeinputs[j]=iomodel->f(VyEnum)[tria_vertex_ids[j]-1]/yts;
 						for(j=0;j<3;j++)cmmininputs[j]=iomodel->f(CmMinEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts;
@@ -3316,5 +3316,5 @@
 					break;
 				case DragCoefficientEnum:
-					if (iomodel->f(DragCoefficientEnum)){
+					if (iomodel->IsLoaded(DragCoefficientEnum)){
 						for(j=0;j<3;j++)nodeinputs[j]=iomodel->f(DragCoefficientEnum)[tria_vertex_ids[j]-1];
 						for(j=0;j<3;j++)cmmininputs[j]=iomodel->f(CmMinEnum)[(tria_vertex_ids[j]-1)*num_control_type+i];
@@ -3332,5 +3332,5 @@
 
 	/*DatasetInputs*/
-	if (iomodel->f(WeightsEnum)) {
+	if (control_analysis) {
 
 		/*Create inputs and add to DataSetInput*/
@@ -5272,5 +5272,5 @@
 			/*default vx,vy and vz: either observation or 0 */
 			if(!iomodel->f(VxEnum)){
-				if (iomodel->f(VxObsEnum)) for(i=0;i<3;i++)nodeinputs[i]=iomodel->f(VxObsEnum)[tria_vertex_ids[i]-1]/yts;
+				if (iomodel->IsLoaded(VxObsEnum)) for(i=0;i<3;i++)nodeinputs[i]=iomodel->f(VxObsEnum)[tria_vertex_ids[i]-1]/yts;
 				else                 for(i=0;i<3;i++)nodeinputs[i]=0;
 				this->inputs->AddInput(new TriaVertexInput(VxEnum,nodeinputs));
@@ -5279,5 +5279,5 @@
 			}
 			if(!iomodel->f(VyEnum)){
-				if (iomodel->f(VyObsEnum)) for(i=0;i<3;i++)nodeinputs[i]=iomodel->f(VyObsEnum)[tria_vertex_ids[i]-1]/yts;
+				if (iomodel->IsLoaded(VyObsEnum)) for(i=0;i<3;i++)nodeinputs[i]=iomodel->f(VyObsEnum)[tria_vertex_ids[i]-1]/yts;
 				else                 for(i=0;i<3;i++)nodeinputs[i]=0;
 				this->inputs->AddInput(new TriaVertexInput(VyEnum,nodeinputs));
@@ -5286,5 +5286,5 @@
 			}
 			if(!iomodel->f(VzEnum)){
-				if (iomodel->f(VzObsEnum)) for(i=0;i<3;i++)nodeinputs[i]=iomodel->f(VzObsEnum)[tria_vertex_ids[i]-1]/yts;
+				if (iomodel->IsLoaded(VzObsEnum)) for(i=0;i<3;i++)nodeinputs[i]=iomodel->f(VzObsEnum)[tria_vertex_ids[i]-1]/yts;
 				else                 for(i=0;i<3;i++)nodeinputs[i]=0;
 				this->inputs->AddInput(new TriaVertexInput(VzEnum,nodeinputs));
Index: /issm/trunk/src/c/objects/IoModel.cpp
===================================================================
--- /issm/trunk/src/c/objects/IoModel.cpp	(revision 9375)
+++ /issm/trunk/src/c/objects/IoModel.cpp	(revision 9376)
@@ -534,6 +534,15 @@
 		
 	parameter=(DoubleMatParam*)this->data->FindParamObject(dataenum);
-	if (parameter==NULL) _error_("Field of enum %s has not been loaded in iomodel",EnumToStringx(dataenum));
+	if (parameter==NULL){
+		/*That might happen: initial velocity might be empty*/
+		return NULL;
+	}
 	return parameter->GetPointer();
+}
+/*}}}*/
+/*FUNCTION IoModel::IsLoaded(int dataenum){{{1*/
+bool IoModel::IsLoaded(int dataenum){
+
+	return this->data->Exist(dataenum);
 }
 /*}}}*/
Index: /issm/trunk/src/c/objects/IoModel.h
===================================================================
--- /issm/trunk/src/c/objects/IoModel.h	(revision 9375)
+++ /issm/trunk/src/c/objects/IoModel.h	(revision 9376)
@@ -18,8 +18,8 @@
 	private: 
 		FILE* fid; //pointer to input file
+		Parameters *data;        //this dataset holds temporary data, memory intensive.
 
 	public:
 		Parameters *constants;   //this dataset holds all double, int, bool and char*parameters read in from the input file.*
-		Parameters *data;        //this dataset holds temporary data, memory intensive.
 
 		/*This data needs to stay memory resident at all time, even if it's memory intensive: */
@@ -41,4 +41,5 @@
 		/*}}}*/
 		/*Input/Output:{{{1*/
+		bool  IsLoaded(int dataenum);
 		void  FetchData(bool*     pboolean,int data_enum);
 		void  FetchData(int*      pinteger,int data_enum);
Index: /issm/trunk/src/c/objects/Materials/Matice.cpp
===================================================================
--- /issm/trunk/src/c/objects/Materials/Matice.cpp	(revision 9375)
+++ /issm/trunk/src/c/objects/Materials/Matice.cpp	(revision 9376)
@@ -674,5 +674,5 @@
 
 		/*Get B*/
-		if (iomodel->f(RheologyBEnum)) {
+		if (iomodel->IsLoaded(RheologyBEnum)) {
 			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->f(RheologyBEnum)[int(iomodel->f(ElementsEnum)[num_vertices*index+i]-1)];
 			this->inputs->AddInput(new TriaVertexInput(RheologyBbarEnum,nodeinputs));
@@ -680,5 +680,5 @@
 
 		/*Get n*/
-		if (iomodel->f(RheologyNEnum)) {
+		if (iomodel->IsLoaded(RheologyNEnum)) {
 			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->f(RheologyNEnum)[index];
 			this->inputs->AddInput(new TriaVertexInput(RheologyNEnum,nodeinputs));
@@ -686,9 +686,9 @@
 
 		/*Control Inputs*/
-		if (control_analysis && iomodel->f(ControlTypeEnum)){
+		if (control_analysis && iomodel->IsLoaded(ControlTypeEnum)){
 			for(i=0;i<num_control_type;i++){
 				switch((int)iomodel->f(ControlTypeEnum)[i]){
 					case RheologyBbarEnum:
-						if (iomodel->f(RheologyBEnum)){
+						if (iomodel->IsLoaded(RheologyBEnum)){
 							_assert_(iomodel->f(RheologyBEnum));_assert_(iomodel->f(CmMinEnum)); _assert_(iomodel->f(CmMaxEnum)); 
 							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->f(RheologyBEnum)[int(iomodel->f(ElementsEnum)[num_vertices*index+j]-1)];
@@ -713,5 +713,5 @@
 
 		/*Get B*/
-		if (iomodel->f(RheologyBEnum)) {
+		if (iomodel->IsLoaded(RheologyBEnum)) {
 			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->f(RheologyBEnum)[int(iomodel->f(ElementsEnum)[num_vertices*index+i]-1)];
 			this->inputs->AddInput(new PentaVertexInput(RheologyBEnum,nodeinputs));
@@ -719,5 +719,5 @@
 
 		/*Get n*/
-		if (iomodel->f(RheologyNEnum)) {
+		if (iomodel->IsLoaded(RheologyNEnum)) {
 			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->f(RheologyNEnum)[index];
 			this->inputs->AddInput(new PentaVertexInput(RheologyNEnum,nodeinputs));
@@ -725,9 +725,9 @@
 
 		/*Control Inputs*/
-		if (control_analysis && iomodel->f(ControlTypeEnum)){
+		if (control_analysis && iomodel->IsLoaded(ControlTypeEnum)){
 			for(i=0;i<num_control_type;i++){
 				switch((int)iomodel->f(ControlTypeEnum)[i]){
 					case RheologyBbarEnum:
-						if (iomodel->f(RheologyBEnum)){
+						if (iomodel->IsLoaded(RheologyBEnum)){
 							_assert_(iomodel->f(RheologyBEnum));_assert_(iomodel->f(CmMinEnum)); _assert_(iomodel->f(CmMaxEnum)); 
 							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->f(RheologyBEnum)[int(iomodel->f(ElementsEnum)[num_vertices*index+j]-1)];
Index: /issm/trunk/src/c/objects/Node.cpp
===================================================================
--- /issm/trunk/src/c/objects/Node.cpp	(revision 9375)
+++ /issm/trunk/src/c/objects/Node.cpp	(revision 9376)
@@ -54,8 +54,8 @@
 	//intialize inputs, and add as many inputs per element as requested: 
 	this->inputs=new Inputs();
-	if (iomodel->f(NodeOnBedEnum))      this->inputs->AddInput(new BoolInput(NodeOnBedEnum,(IssmBool)iomodel->f(NodeOnBedEnum)[io_index]));
-	if (iomodel->f(NodeOnSurfaceEnum))  this->inputs->AddInput(new BoolInput(NodeOnSurfaceEnum,(IssmBool)iomodel->f(NodeOnSurfaceEnum)[io_index]));
-	if (iomodel->f(NodeOnIceShelfEnum)) this->inputs->AddInput(new BoolInput(NodeOnIceShelfEnum,(IssmBool)iomodel->f(NodeOnIceShelfEnum)[io_index]));
-	if (iomodel->f(NodeOnIceSheetEnum)) this->inputs->AddInput(new BoolInput(NodeOnIceSheetEnum,(IssmBool)iomodel->f(NodeOnIceSheetEnum)[io_index]));
+	if (iomodel->IsLoaded(NodeOnBedEnum))      this->inputs->AddInput(new BoolInput(NodeOnBedEnum,(IssmBool)iomodel->f(NodeOnBedEnum)[io_index]));
+	if (iomodel->IsLoaded(NodeOnSurfaceEnum))  this->inputs->AddInput(new BoolInput(NodeOnSurfaceEnum,(IssmBool)iomodel->f(NodeOnSurfaceEnum)[io_index]));
+	if (iomodel->IsLoaded(NodeOnIceShelfEnum)) this->inputs->AddInput(new BoolInput(NodeOnIceShelfEnum,(IssmBool)iomodel->f(NodeOnIceShelfEnum)[io_index]));
+	if (iomodel->IsLoaded(NodeOnIceSheetEnum)) this->inputs->AddInput(new BoolInput(NodeOnIceSheetEnum,(IssmBool)iomodel->f(NodeOnIceSheetEnum)[io_index]));
 	if (iomodel->numbernodetoelementconnectivity) this->inputs->AddInput(new IntInput(NumberNodeToElementConnectivityEnum,(IssmInt)iomodel->numbernodetoelementconnectivity[io_index]));
 	if (analysis_type==DiagnosticHorizAnalysisEnum) this->inputs->AddInput(new IntInput(ApproximationEnum,(IssmInt)iomodel->f(VerticesTypeEnum)[io_index]));
@@ -64,5 +64,5 @@
 
 	/*spc all nodes on water*/
-	if (!iomodel->f(NodeOnWaterEnum)) _error_("iomodel->nodeonwater is NULL");
+	if (!iomodel->IsLoaded(NodeOnWaterEnum)) _error_("iomodel->nodeonwater is NULL");
 	if (iomodel->f(NodeOnWaterEnum)[io_index]){
 		for(k=1;k<=gsize;k++){
@@ -75,6 +75,6 @@
 		if (dim==3){
 			/*We have a  3d mesh, we may have collapsed elements, hence dead nodes. Freeze them out: */
-			if (!iomodel->f(NodeOnBedEnum)) _error_("iomodel->nodeonbed is NULL");
-			if (!iomodel->f(VerticesTypeEnum)) _error_("iomodel->vertices_type is NULL");
+			if (!iomodel->IsLoaded(NodeOnBedEnum)) _error_("iomodel->nodeonbed is NULL");
+			if (!iomodel->IsLoaded(VerticesTypeEnum)) _error_("iomodel->vertices_type is NULL");
 			if (iomodel->f(VerticesTypeEnum)[io_index]==MacAyealApproximationEnum && !iomodel->f(NodeOnBedEnum)[io_index]){
 				for(k=1;k<=gsize;k++) this->FreezeDof(k);
@@ -92,5 +92,5 @@
 		}
 		/*spc all nodes on hutter*/
-		if (!iomodel->f(NodeOnHutterEnum)) _error_("iomodel->nodeonhutter is NULL");
+		if (!iomodel->IsLoaded(NodeOnHutterEnum)) _error_("iomodel->nodeonhutter is NULL");
 		if (iomodel->f(NodeOnHutterEnum)[io_index]){
 			for(k=1;k<=gsize;k++){
@@ -104,5 +104,5 @@
 	if (analysis_type==DiagnosticHutterAnalysisEnum){
 		/*Constrain all nodes that are not Hutter*/
-		if (!iomodel->f(NodeOnHutterEnum)) _error_("iomodel->nodeonhutter is NULL");
+		if (!iomodel->IsLoaded(NodeOnHutterEnum)) _error_("iomodel->nodeonhutter is NULL");
 		if (!iomodel->f(NodeOnHutterEnum)[io_index]){
 			for(k=1;k<=gsize;k++){
