Changeset 16768


Ignore:
Timestamp:
11/14/13 16:14:35 (11 years ago)
Author:
Eric.Larour
Message:

CHG: new fetch multiple data for integers.

Location:
issm/trunk-jpl/src/c/classes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/IoModel.cpp

    r16641 r16768  
    13001300}
    13011301/*}}}*/
     1302/*FUNCTION IoModel::FetchMultipleData(int*** pmatrices,int** pmdims,int** pndims, int* pM,int data_enum){{{*/
     1303void  IoModel::FetchMultipleData(int*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,int data_enum){
     1304
     1305        int     num_instances;
     1306        fpos_t* file_positions=NULL;
     1307
     1308        /*output: */
     1309        int        **matrices = NULL;
     1310        int         *mdims    = NULL;
     1311        int         *ndims    = NULL;
     1312
     1313        /*intermediary: */
     1314        int          M, N;
     1315        IssmPDouble *pmatrix = NULL;
     1316        IssmDouble  *matrix  = NULL;
     1317        int         *integer_matrix=NULL;
     1318        int         *codes   = NULL;
     1319        int          code;
     1320
     1321        /*recover my_rank:*/
     1322        int my_rank=IssmComm::GetRank();
     1323       
     1324        /*Get file pointers to beginning of the data (multiple instances of it): */
     1325        file_positions=this->SetFilePointersToData(&codes,NULL,&num_instances,data_enum);
     1326
     1327        if(num_instances){
     1328
     1329                /*Allocate matrices :*/
     1330                matrices=xNew<int*>(num_instances);
     1331                mdims=xNew<int>(num_instances);
     1332                ndims=xNew<int>(num_instances);
     1333
     1334                for(int i=0;i<num_instances;i++){
     1335
     1336                        if(my_rank==0){
     1337                                code=codes[i];
     1338
     1339                                if((code!=5) && (code!=6) && (code!=7))_error_("expecting a IssmDouble, integer or boolean matrix for enum " << EnumToStringx(data_enum));
     1340
     1341                                /*We have to read a matrix from disk. First read the dimensions of the matrix, then the whole matrix: */
     1342                                /*numberofelements: */
     1343                                fsetpos(fid,file_positions+i);
     1344                                if(fread(&M,sizeof(int),1,fid)!=1) _error_("could not read number of rows for matrix ");
     1345                        }
     1346                        ISSM_MPI_Bcast(&M,1,ISSM_MPI_INT,0,IssmComm::GetComm());
     1347
     1348                        if(my_rank==0){ 
     1349                                if(fread(&N,sizeof(int),1,fid)!=1) _error_("could not read number of columns for matrix ");
     1350                        }
     1351                        ISSM_MPI_Bcast(&N,1,ISSM_MPI_INT,0,IssmComm::GetComm());
     1352
     1353
     1354                        /*Now allocate matrix: */
     1355                        if(M*N){
     1356                                pmatrix=xNew<IssmPDouble>(M*N);
     1357                                integer_matrix=xNew<int>(M*N);
     1358
     1359                                /*Read matrix on node 0, then broadcast: */
     1360                                if(my_rank==0){ 
     1361                                        if(fread(pmatrix,M*N*sizeof(IssmPDouble),1,fid)!=1) _error_("could not read matrix ");
     1362                                }
     1363                                ISSM_MPI_Bcast(pmatrix,M*N,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());
     1364
     1365                                _assert_(this->independents);
     1366                                if(this->independents[data_enum]){
     1367                                        /*this data has already been checked out! So cancel all that we've done here, and return
     1368                                         * the data[data_enum] directly: */
     1369                                        matrix=this->data[data_enum];
     1370                                        for (int i=0;i<M*N;++i) integer_matrixmatrix[i]=reCast<int>(matrix[i]);
     1371                                }
     1372                                else{
     1373                                        for (int i=0;i<M*N;++i) integer_matrix[i]=pmatrix[i];
     1374                                }
     1375                                xDelete<IssmPDouble>(pmatrix);
     1376                        }
     1377                        else
     1378                                integer_matrix=NULL;
     1379                       
     1380                       
     1381                        /*Assign: */
     1382                        mdims[i]=M;
     1383                        matrices[i]=integer_matrix;
     1384                        ndims[i]=N;
     1385                }
     1386        }
     1387                       
     1388        /*Free ressources:*/
     1389        xDelete<fpos_t>(file_positions);
     1390        xDelete<int>(codes);
     1391
     1392        /*Assign output pointers: */
     1393        *pmatrices=matrices;
     1394        if(pmdims){
     1395                *pmdims=mdims;
     1396        }
     1397        else{
     1398                xDelete<int>(mdims);
     1399        }
     1400        if(pndims){
     1401                *pndims=ndims;
     1402        }
     1403        else{
     1404                xDelete<int>(ndims);
     1405        }
     1406        *pnumrecords=num_instances;
     1407}
     1408/*}}}*/
    13021409/*FUNCTION IoModel::FetchDataToInput(Elements* elements,int vector_enum,IssmDouble default_value){{{*/
    13031410void IoModel::FetchDataToInput(Elements* elements,int vector_enum,IssmDouble default_value){
  • issm/trunk-jpl/src/c/classes/IoModel.h

    r16388 r16768  
    7979                void        FetchMultipleData(char***   pstringarray,int* pnumstrings,int data_enum);
    8080                void        FetchMultipleData(IssmDouble*** pmatrixarray,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
     81                void        FetchMultipleData(int*** pmatrices,int** pmdims,int** pndims, int* pnumrecords,int data_enum);
    8182                void        FetchData(Option **poption,int data_enum);
    8283                void        FetchData(int num,...);
Note: See TracChangeset for help on using the changeset viewer.