Index: /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/objects/IoModel.h =================================================================== --- /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/objects/IoModel.h (revision 12264) +++ /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/objects/IoModel.h (revision 12265) @@ -40,25 +40,26 @@ IoModel(FILE* iomodel_handle); /*Input/Output*/ - void Constant(bool *poutput,int constant_enum); - void Constant(int *poutput,int constant_enum); - void Constant(double *poutput,int constant_enum); - void Constant(char **poutput,int constant_enum); - Param *CopyConstantObject(int constant_enum); - double *Data(int dataenum); - void DeleteData(int num,...); - void FetchConstants(void); - void FetchData(bool* pboolean,int data_enum); - void FetchData(int* pinteger,int data_enum); - void FetchData(double* pscalar,int data_enum); - void FetchData(char** pstring,int data_enum); - void FetchData(int** pmatrix,int* pM,int* pN,int data_enum); - void FetchData(double** pscalarmatrix,int* pM,int* pN,int data_enum); - void FetchData(char*** pstringarray,int* pnumstrings,int data_enum); - void FetchData(double*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,int data_enum); - void FetchData(int num,...); - void FetchDataToInput(Elements* elements,int vector_enum,int default_vector_enum=NoneEnum,double default_value=0); - FILE* SetFilePointerToData(int* pcode,int* pvector_type, int data_enum); + void CheckEnumSync(void); + void Constant(bool *poutput,int constant_enum); + void Constant(int *poutput,int constant_enum); + void Constant(double *poutput,int constant_enum); + void Constant(char **poutput,int constant_enum); + Param *CopyConstantObject(int constant_enum); + double *Data(int dataenum); + void DeleteData(int num,...); + void FetchConstants(void); + void FetchData(bool* pboolean,int data_enum); + void FetchData(int* pinteger,int data_enum); + void FetchData(double* pscalar,int data_enum); + void FetchData(char** pstring,int data_enum); + void FetchData(int** pmatrix,int* pM,int* pN,int data_enum); + void FetchData(double** pscalarmatrix,int* pM,int* pN,int data_enum); + void FetchData(char*** pstringarray,int* pnumstrings,int data_enum); + void FetchData(double*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,int data_enum); + void FetchData(int num,...); + void FetchDataToInput(Elements* elements,int vector_enum,int default_vector_enum=NoneEnum,double default_value=0); + FILE* SetFilePointerToData(int* pcode,int* pvector_type, int data_enum); }; #endif /* _IOMODEL_H */ Index: /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/objects/IoModel.cpp =================================================================== --- /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/objects/IoModel.cpp (revision 12264) +++ /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/objects/IoModel.cpp (revision 12265) @@ -44,6 +44,9 @@ /*First, keep track of the file handle: */ this->fid=iomodel_handle; + /*Check that Enums are Synchronized*/ + this->CheckEnumSync(); + /*Initialize and read constants:*/ this->constants=new Parameters(); this->FetchConstants(); /*this routine goes through the input file, and fetches bools, ints, doubles and strings only, nothing memory intensive*/ @@ -88,6 +91,35 @@ } /*}}}*/ +/*FUNCTION IoModel::CheckEnumSync{{{1*/ +void IoModel::CheckEnumSync(void){ + + extern int my_rank; + int record_enum = 0; + + + /*Check that some fields have been allocated*/ + _assert_(this->fid || my_rank); + + + /*Go find in the binary file, the position of the data we want to fetch: */ + if(my_rank==0){ //cpu 0 + + /*First set FILE* position to the beginning of the file: */ + fseek(this->fid,0,SEEK_SET); + + /*Get first Enum*/ + if(fread(&record_enum,sizeof(int),1,this->fid)==0){ + _error_("Marshalled file is empty"); + } + else{ + if(record_enum!=MaximumNumberOfEnums){ + _error_("Enums in marshalled file are not compatible with compiled code, make sure you are using the same version of ISSM"); + } + } + } +} +/*}}}*/ /*FUNCTION IoModel::Constant(bool* poutput,int constant_enum){{{1*/ void IoModel::Constant(bool* poutput,int constant_enum){ Index: /proj/ice/larour/issm-uci-clean/trunk-jpl/src/m/model/marshall.m =================================================================== --- /proj/ice/larour/issm-uci-clean/trunk-jpl/src/m/model/marshall.m (revision 12264) +++ /proj/ice/larour/issm-uci-clean/trunk-jpl/src/m/model/marshall.m (revision 12265) @@ -15,6 +15,9 @@ error(['marshall error message: could not open ' [md.miscellaneous.name '.bin'],' file for binary writing']); end +%First, right MaximumNumberOfEnum to make sure that the Enums are synchronized +WriteData(fid,'enum',MaximumNumberOfEnums(),'data',true,'format','Boolean'); + %Go through all model fields: check that it is a class and call checkconsistency fields=properties('model'); for i=1:length(fields),