Changeset 16768
- Timestamp:
- 11/14/13 16:14:35 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/classes
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/IoModel.cpp
r16641 r16768 1300 1300 } 1301 1301 /*}}}*/ 1302 /*FUNCTION IoModel::FetchMultipleData(int*** pmatrices,int** pmdims,int** pndims, int* pM,int data_enum){{{*/ 1303 void 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 /*}}}*/ 1302 1409 /*FUNCTION IoModel::FetchDataToInput(Elements* elements,int vector_enum,IssmDouble default_value){{{*/ 1303 1410 void IoModel::FetchDataToInput(Elements* elements,int vector_enum,IssmDouble default_value){ -
issm/trunk-jpl/src/c/classes/IoModel.h
r16388 r16768 79 79 void FetchMultipleData(char*** pstringarray,int* pnumstrings,int data_enum); 80 80 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); 81 82 void FetchData(Option **poption,int data_enum); 82 83 void FetchData(int num,...);
Note:
See TracChangeset
for help on using the changeset viewer.