00001 /* 00002 rdomain.h 00003 Igor Terentyev. 00004 ******************************************************************************** 00005 */ 00012 /*============================================================================*/ 00013 00014 #ifndef __RDOMAIN_H_ 00015 #define __RDOMAIN_H_ 00016 /*----------------------------------------------------------------------------*/ 00017 00018 #include "utils.h" 00019 #include "rarray.h" 00020 00021 /*----------------------------------------------------------------------------*/ 00022 /* 00023 Domain. 00024 00025 int narr : number of arrays in the domain. 00026 RARR _s[] : array storage pointer. 00027 */ 00031 typedef struct 00032 { 00034 int narr; 00037 RARR _s[RDOM_MAX_NARR]; 00038 } RDOM; 00039 /*----------------------------------------------------------------------------*/ 00040 /* 00041 Functions' parameters. 00042 00043 RDOM *dom : domain pointer. 00044 int narr : number of arrays. 00045 int iarr : array index 00046 int ndim : number of dimensions. 00047 int idim : dimension number. 00048 IPNT dgs[], dge[] : array start/end global indices pointer. 00049 IPNT dn[] : array sizes pointer. 00050 IPNT gs, ge : array start/end global indices pointer. 00051 IPNT n : array sizes pointer. 00052 IPNT os, oe : array start, end offsets (>0 - inside, <0 - outside). 00053 IPNT li : local indices. 00054 IPNT gi : global indices. 00055 int islice : slice index. 00056 ireal r : array value. 00057 FILE* stream : output stream. 00058 const char* path : file name. 00059 00060 int return : error code. 00061 */ 00062 /*----------------------------------------------------------------------------*/ 00069 int rd_a_setnull(RDOM *dom); 00078 int rd_setnull(RDOM *dom, int iarr); 00079 /*----------------------------------------------------------------------------*/ 00080 /* 00081 Create domain arrays / next array (STORAGE ALLOCATION). 00082 */ 00093 int rd_a_create_s(RDOM *dom, int narr, IPNT dgs[], IPNT dn[]); 00104 int rd_a_create_e(RDOM *dom, int narr, IPNT dge[], IPNT dn[]); 00115 int rd_a_create(RDOM *dom, int narr, IPNT dgs[], IPNT dge[]); 00125 int rd_create_s(RDOM *dom, IPNT gs, IPNT n); 00135 int rd_create_e(RDOM *dom, IPNT ge, IPNT n); 00145 int rd_create(RDOM *dom, IPNT gs, IPNT ge); 00146 /*----------------------------------------------------------------------------*/ 00147 /* 00148 Declare domain arrays / next array. 00149 */ 00161 int rd_a_declare_s(RDOM *dom, int narr, IPNT dgs[], IPNT dn[]); 00173 int rd_a_declare_e(RDOM *dom, int narr, IPNT dge[], IPNT dn[]); 00185 int rd_a_declare(RDOM *dom, int narr, IPNT dgs[], IPNT dge[]); 00196 int rd_declare_s(RDOM *dom, IPNT gs, IPNT n); 00207 int rd_declare_e(RDOM *dom, IPNT ge, IPNT n); 00218 int rd_declare(RDOM *dom, IPNT gs, IPNT ge); 00219 /*----------------------------------------------------------------------------*/ 00220 /* 00221 Allocate all arrays/array. 00222 NOTE: rd_a_allocate supresses E_ALREADYALLOC errors! 00223 */ 00231 int rd_a_allocate(RDOM *dom); 00240 int rd_allocate(RDOM *dom, int iarr); 00241 /*----------------------------------------------------------------------------*/ 00245 int rd_a_destroy(RDOM *dom); 00246 /*----------------------------------------------------------------------------*/ 00247 /* 00248 Set array (NO STORAGE ALLOCATION). 00249 */ 00260 int rd_a_greset(RDOM *dom, IPNT dgs[], IPNT dge[]); 00272 int rd_greset_s(RDOM *dom, int iarr, IPNT gs, IPNT n); 00284 int rd_greset_e(RDOM *dom, int iarr, IPNT ge, IPNT n); 00296 int rd_greset(RDOM *dom, int iarr, IPNT gs, IPNT ge); 00307 int rd_offset_s(RDOM *dom, int iarr, IPNT os, IPNT n); 00318 int rd_offset_e(RDOM *dom, int iarr, IPNT oe, IPNT n); 00329 int rd_offset(RDOM *dom, int iarr, IPNT os, IPNT oe); 00330 /*----------------------------------------------------------------------------*/ 00331 /* Resize all arrays (NO STORAGE ALLOCATION). */ 00332 /*----------------------------------------------------------------------------*/ 00333 /* 00334 Dump domain information. 00335 */ 00339 int rd_a_dump (const RDOM *dom, FILE* stream); 00348 int rd_dump(const RDOM *dom, int iarr, FILE* stream); 00349 /*----------------------------------------------------------------------------*/ 00350 /* 00351 Formatted and binary output of array / all arrays in domain. 00352 */ 00361 int rd_a_print(RDOM *dom, FILE* stream); 00370 int rd_a_fprint(RDOM *dom, const char *path); 00380 int rd_a_fsprint(RDOM *dom, const char *path); 00390 int rd_print(RDOM *dom, int iarr, FILE* stream); 00400 int rd_fprint(RDOM *dom, int iarr, const char *path); 00410 int rd_write(RDOM *dom, int iarr, FILE* stream); 00420 int rd_fwrite(RDOM *dom, int iarr, const char *path); 00421 /*----------------------------------------------------------------------------*/ 00422 /* 00423 Formatted and binary output of array slice to stream/file. 00424 */ 00430 int rd_printslice(RDOM *dom, int iarr, FILE* stream, int idim, int islice); 00436 int rd_fprintslice(RDOM *dom, int iarr, const char *path, int idim, int islice); 00442 int rd_writeslice(RDOM *dom, int iarr, FILE* stream, int idim, int islice); 00448 int rd_fwriteslice(RDOM *dom, int iarr, const char *path, int idim, int islice); 00449 /*----------------------------------------------------------------------------*/ 00450 /* 00451 Get/set value. 00452 If index or array number is out of bounds, these functions: 00453 1) Do not perform get/set operation. 00454 2) Write error info into stderr. 00455 */ 00466 ireal rd_get(const RDOM *dom, int iarr, IPNT li); 00476 ireal rd_gget(const RDOM *dom, int iarr, IPNT gi); 00488 void rd_set(RDOM *dom, int iarr, IPNT li, ireal r); 00499 void rd_gset(RDOM *dom, int iarr, IPNT gi, ireal r); 00500 /*----------------------------------------------------------------------------*/ 00501 /* 00502 Get size, gloabal start/end indices. 00503 gs, ge can be NULL. 00504 */ 00510 int rd_size(RDOM *dom, int iarr, IPNT n); 00516 int rd_a_size(RDOM *dom, int iarr, IPNT n); 00522 int rd_gse(const RDOM *dom, int iarr, IPNT gs, IPNT ge); 00528 int rd_a_gse(const RDOM *dom, int iarr, IPNT gs, IPNT ge); 00529 /*----------------------------------------------------------------------------*/ 00530 /* 00531 Get number of dimensions/arrays 00532 */ 00544 int rd_ndim(const RDOM *dom, int iarr, int *ndim); 00548 int rd_a_narr(const RDOM *dom, int *narr); 00549 /*----------------------------------------------------------------------------*/ 00550 /* 00551 Array empty query. 00552 */ 00558 int rd_setempty(RDOM *dom, int iarr); 00567 int rd_empty(RDOM *dom, int iarr, int *empty); 00568 /*----------------------------------------------------------------------------*/ 00569 /* 00570 Populates exchange info. Creates MPI_Datatype inside - do not forget to destroy. 00571 */ 00582 int rd_setexchangeinfo(RDOM *dom, int iarr, EXCHANGEINFO *einfo); 00583 /*----------------------------------------------------------------------------*/ 00584 /* 00585 Checks if arrays overlap. 00586 */ 00596 int rd_overlap(RDOM *dom1, int iarr1, RDOM *dom2, int iarr2, int *overlap); 00597 /*----------------------------------------------------------------------------*/ 00598 /* 00599 Set arr1 := arr1 intesect arr2 00600 */ 00612 int rd_setoverlap(RDOM *dom1, int iarr1, RDOM *dom2, int iarr2); 00613 /*----------------------------------------------------------------------------*/ 00614 /* 00615 * part of infrastructure to give RDOM minimal DataContainer characteristics 00616 * 00617 * note that inner product is over ALLOCATED arrays, not just 00618 * virtual arrays 00619 * 00620 * @param [in] d1 - (RDOM const *) input array 1 00621 * @param [in] d2 - (RDOM const *) input array 2 00622 * @param [out] ip - (ireal) inner product - unscaled l2 00623 * @return 0 - normal return 00624 */ 00625 int rd_a_inner(RDOM const * dom1, RDOM const * dom2, ireal * ip); 00626 00627 /*----------------------------------------------------------------------------*/ 00628 /* 00629 * part of infrastructure to give RDOM minimal DataContainer characteristics 00630 * 00631 * note: zeros ALL ALLOCATED arrays, not just virtual arrays 00632 * 00633 * @param [in] dom - (RDOM const *) input array 00634 * @return 0 - normal return 00635 */ 00636 int rd_a_zero(RDOM * dom); 00637 00638 /*----------------------------------------------------------------------------*/ 00639 /* 00640 * part of infrastructure to give RDOM minimal DataContainer characteristics 00641 * 00642 * note: scales ALLOCATED array by index 00643 * 00644 * @param [in] dom - (RDOM const *) input array 00645 * @return 0 - normal return 00646 */ 00647 int rd_a_scale(RDOM * dom, int iarr, ireal fac); 00648 00649 #endif /*__RDOMAIN_H_*/