/*!\file DoubleMatExternalResult.c * \brief: implementation of the DoubleMatExternalResult object */ /*header files: */ /*{{{1*/ #ifdef HAVE_CONFIG_H #include #else #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!" #endif #include #include #include "../objects.h" #include "../../EnumDefinitions/EnumDefinitions.h" #include "../../shared/shared.h" #include "../../Container/Container.h" #include "../../include/include.h" /*}}}*/ /*DoubleMatExternalResult constructors and destructor*/ /*FUNCTION DoubleMatExternalResult::DoubleMatExternalResult(){{{1*/ DoubleMatExternalResult::DoubleMatExternalResult(){ return; } /*}}}*/ /*FUNCTION DoubleMatExternalResult::DoubleMatExternalResult(int in_id, int enum_type,IssmDoubleMat values,int M,int N,int in_step,double in_time){{{1*/ DoubleMatExternalResult::DoubleMatExternalResult(int in_id, int in_enum_type,double* in_values, int in_M,int in_N,int in_step,double in_time){ id=in_id; enum_type=in_enum_type; M=in_M; N=in_N; /*Copy result in values*/ if(M*N){ values=(double*)xmalloc(M*N*sizeof(double)); memcpy(values,in_values,M*N*sizeof(double)); } else values=NULL; step=in_step; time=in_time; } /*}}}*/ /*FUNCTION DoubleMatExternalResult::~DoubleMatExternalResult(){{{1*/ DoubleMatExternalResult::~DoubleMatExternalResult(){ xfree((void**)&this->values); return; } /*}}}*/ /*Object virtual functions definitions:*/ /*FUNCTION DoubleMatExternalResult::Echo {{{1*/ void DoubleMatExternalResult::Echo(void){ printf("DoubleMatExternalResult:\n"); printf(" enum: %i (%s)\n",this->enum_type,EnumToStringx(this->enum_type)); printf(" step: %i\n",this->step); printf(" time: %g\n",this->time); printf(" matrix size: %i-%i\n",this->M,this->N); } /*}}}*/ /*FUNCTION DoubleMatExternalResult::DeepEcho{{{1*/ void DoubleMatExternalResult::DeepEcho(void){ int i,j; printf("DoubleMatExternalResult:\n"); printf(" id: %i\n",this->id); printf(" enum: %i (%s)\n",this->enum_type,EnumToStringx(this->enum_type)); printf(" step: %i\n",this->step); printf(" time: %g\n",this->time); printf(" matrix size: %i-%i\n",this->M,this->N); for (i=0;iM;i++){ printf(" [ "); for (j=0;jN;j++){ printf(" %12.6g ",this->values[i*this->N+j]); } printf(" ]\n"); } printf("\n"); } /*}}}*/ /*FUNCTION DoubleMatExternalResult::Id{{{1*/ int DoubleMatExternalResult::Id(void){ return -1; } /*}}}*/ /*FUNCTION DoubleMatExternalResult::MyRank{{{1*/ int DoubleMatExternalResult::MyRank(void){ extern int my_rank; return my_rank; } /*}}}*/ #ifdef _SERIAL_ /*FUNCTION DoubleMatExternalResult::Marshall{{{1*/ void DoubleMatExternalResult::Marshall(char** pmarshalled_dataset){ char* marshalled_dataset=NULL; int enum_value=0; /*recover marshalled_dataset: */ marshalled_dataset=*pmarshalled_dataset; /*get enum value of DoubleMatExternalResult: */ enum_value=DoubleMatExternalResultEnum; /*marshall enum: */ memcpy(marshalled_dataset,&enum_value,sizeof(enum_value));marshalled_dataset+=sizeof(enum_value); /*marshall DoubleMatExternalResult data: */ memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id); memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type); memcpy(marshalled_dataset,&M,sizeof(M));marshalled_dataset+=sizeof(M); memcpy(marshalled_dataset,&N,sizeof(N));marshalled_dataset+=sizeof(N); memcpy(marshalled_dataset,values,M*sizeof(double));marshalled_dataset+=M*sizeof(double); memcpy(marshalled_dataset,&step,sizeof(step));marshalled_dataset+=sizeof(step); memcpy(marshalled_dataset,&time,sizeof(time));marshalled_dataset+=sizeof(time); *pmarshalled_dataset=marshalled_dataset; } /*}}}*/ /*FUNCTION DoubleMatExternalResult::MarshallSize{{{1*/ int DoubleMatExternalResult::MarshallSize(){ return sizeof(M) +sizeof(N) +M*N*sizeof(double) +sizeof(id) +sizeof(enum_type) +sizeof(step) +sizeof(time) +sizeof(int); //sizeof(int) for enum value } /*}}}*/ /*FUNCTION DoubleMatExternalResult::Demarshall{{{1*/ void DoubleMatExternalResult::Demarshall(char** pmarshalled_dataset){ char* marshalled_dataset=NULL; int i; /*recover marshalled_dataset: */ marshalled_dataset=*pmarshalled_dataset; /*this time, no need to get enum type, the pointer directly points to the beginning of the *object data (thanks to DataSet::Demarshall):*/ memcpy(&id,marshalled_dataset,sizeof(id));marshalled_dataset+=sizeof(id); memcpy(&enum_type,marshalled_dataset,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type); /*data: */ memcpy(&M,marshalled_dataset,sizeof(M));marshalled_dataset+=sizeof(M); memcpy(&N,marshalled_dataset,sizeof(N));marshalled_dataset+=sizeof(N); values=(double*)xmalloc(M*N*sizeof(double)); memcpy(values,marshalled_dataset,M*N*sizeof(double));marshalled_dataset+=M*N*sizeof(double); memcpy(&step,marshalled_dataset,sizeof(step));marshalled_dataset+=sizeof(step); memcpy(&time,marshalled_dataset,sizeof(time));marshalled_dataset+=sizeof(time); /*return: */ *pmarshalled_dataset=marshalled_dataset; return; } /*}}}*/ #endif /*FUNCTION DoubleMatExternalResult::ObjectEnum{{{1*/ int DoubleMatExternalResult::ObjectEnum(void){ return DoubleMatExternalResultEnum; } /*}}}*/ /*FUNCTION DoubleMatExternalResult::copy{{{1*/ Object* DoubleMatExternalResult::copy() { return new DoubleMatExternalResult(this->id,this->enum_type,this->values,this->M,this->N,this->step,this->time); } /*}}}*/ /*DoubleMatExternalResult management: */ /*FUNCTION DoubleMatExternalResult::WriteData{{{1*/ void DoubleMatExternalResult::WriteData(FILE* fid,bool io_gather){ int length; int type; int rows,cols; char *name = NULL; extern int my_rank; if(io_gather){ /*we are gathering the data on cpu 0, don't write on other cpus: */ if(my_rank) return; } /*First write enum: */ EnumToStringx(&name,this->enum_type); length=(strlen(name)+1)*sizeof(char); fwrite(&length,sizeof(int),1,fid); fwrite(name,length,1,fid); xfree((void**)&name); /*Now write time and step: */ fwrite(&time,sizeof(double),1,fid); fwrite(&step,sizeof(int),1,fid); /*writing a double array, type is 3:*/ type=3; fwrite(&type,sizeof(int),1,fid); rows=this->M; fwrite(&rows,sizeof(int),1,fid); cols=this->N; fwrite(&cols,sizeof(int),1,fid); fwrite(this->values,cols*rows*sizeof(double),1,fid); } /*}}}1*/ /*FUNCTION DoubleMatExternalResult::GetResultName{{{1*/ void DoubleMatExternalResult::GetResultName(char** pname){ EnumToStringx(pname,this->enum_type); } /*}}}*/ /*FUNCTION DoubleMatExternalResult::GetStep{{{1*/ int DoubleMatExternalResult::GetStep(void){ return this->step; } /*}}}*/