1 /* This file is part of MED.
2 *
3 * COPYRIGHT (C) 1999 - 2019 EDF R&D, CEA/DEN
4 * MED is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * MED is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with MED. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18
19 #include <med.h>
20 #include <med_config.h>
21 #include <med_outils.h>
22 #include <hdf5.h>
23
24 #include <string.h>
25
26 /**\ingroup MEDfilter
27 \MEDfilterBrief
28 \param fid \fid
29 \param nentity \nentity \nentityMEDfilterCm
30 \param nvaluesperentity \nvaluesperentity \nvaluesperentityMEDfilterCm \nvaluesperentityMEDfilterEx
31 \param nconstituentpervalue \nconstituentpervalue \nconstituentpervalueMEDfilterEx
32 \param constituentselect \constituentselect \constituentselectMEDfilterEx
33 \param storagemode \storagemode
34 \param profilename \profilename
35 \param filterarraysize \filterarraysize \filterarraysizeMEDfilterCm
36 \param filterarray \filterarray
37 \retval \filter \filterMEDfilterCm
38 \return \error
39
40 \details
41 \MEDfilterDetails
42 \par Remarques
43 \MEDfilterNoICNote
44 */
45
_identity(const med_int * const filterarray,int i)46 static med_int _identity (const med_int * const filterarray, int i) { return i; }
_withfilterarray(const med_int * const filterarray,int i)47 static med_int _withfilterarray (const med_int * const filterarray, int i) { return (filterarray[i]-1); }
48
_MEDfilterEntityNoICompactCr(const med_idt fid,const med_int nentity,const med_int nvaluesperentity,const med_int nconstituentpervalue,const med_int constituentselect,const med_storage_mode storagemode,const char * const profilename,const med_int filterarraysize,const med_int * const filterarray,med_filter * const filter)49 med_err _MEDfilterEntityNoICompactCr(const med_idt fid,
50 const med_int nentity,
51 const med_int nvaluesperentity,
52 const med_int nconstituentpervalue,
53 const med_int constituentselect,
54 const med_storage_mode storagemode,
55 const char * const profilename,
56 const med_int filterarraysize,
57 const med_int* const filterarray,
58 med_filter* const filter) {
59
60 med_idt _memspace[1]={0},_diskspace[1]={0};
61 med_size _memspacesize[1];
62 med_size _diskspacesize[1];
63 med_int profilearraysize=0;
64 med_int _profilearraysize=0;
65 med_int _filterarraysize=0,(*_filterarrayfunc)(const med_int * const,int)=0;
66 med_size *_fltmem=NULL,*_pfldisk=NULL;
67 med_size _fltmemsize[1],_pfldisksize[1];
68 med_size _onedimallvaluesmemoffset=0;
69 med_size _onedimallvaluesdiskoffset=0;
70 med_err _ret=-1;
71 int _i=0,_j=0,_index=0;
72 int _dim=0, _firstdim=0, _dimutil=0, _lastdim=0 ;
73
74 if ( constituentselect != MED_ALL_CONSTITUENT) {
75 _firstdim = constituentselect-1;
76 _lastdim = constituentselect;
77 _dimutil = 1;
78 } else {
79 _firstdim = 0;
80 _lastdim = nconstituentpervalue;
81 _dimutil = nconstituentpervalue;
82 }
83
84 /* Conditionne les traitements à l'existence d'un profil */
85 if ( strlen(profilename) ) {
86 profilearraysize = MEDprofileSizeByName(fid,profilename);
87 _profilearraysize=profilearraysize;
88 } else {
89 _profilearraysize = nentity;
90 }
91
92 /* Conditionne les traitements à l'existence d'un filtre */
93 if ( (filterarraysize <= 0) ) {
94 _filterarrayfunc = _identity;
95 _filterarraysize = _profilearraysize;
96 } else {
97 _filterarrayfunc = _withfilterarray;
98 _filterarraysize = filterarraysize;
99 }
100
101 _onedimallvaluesmemoffset = _filterarraysize*nvaluesperentity;
102 _fltmemsize[0] = _onedimallvaluesmemoffset*_dimutil;
103 _fltmem = (med_size *) malloc (sizeof(med_size)*_fltmemsize[0]);
104 _memspacesize[0] = _filterarraysize*nvaluesperentity*nconstituentpervalue;
105
106 if ( (_memspace[0] = H5Screate_simple (1,_memspacesize, NULL)) <0) {
107 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_MEMSPACE,MED_ERR_SIZE_MSG);
108 ISCRUTE_size(*_memspacesize);
109 goto ERROR;
110 }
111
112 _pfldisksize[0] = _fltmemsize[0];
113 _pfldisk = (med_size *) malloc (sizeof(med_size)*_pfldisksize[0]);
114 _onedimallvaluesdiskoffset = _profilearraysize*nvaluesperentity;
115 _diskspacesize[0] = _onedimallvaluesdiskoffset*nconstituentpervalue;
116
117 if ( (_diskspace[0] = H5Screate_simple (1,_diskspacesize, NULL)) <0) {
118 MED_ERR_(_ret,MED_ERR_CREATE,MED_ERR_DISKSPACE,MED_ERR_ID_MSG);
119 ISCRUTE_id(_diskspace[0]);
120 goto ERROR;
121 }
122
123
124 for (_dim=_firstdim; _dim < _lastdim; ++_dim) {
125 for (_i=0; _i < _filterarraysize; ++_i) {
126 for (_j=0; _j < nvaluesperentity; ++_j) {
127 _fltmem [_index] = _dim*_onedimallvaluesmemoffset + _i*nvaluesperentity+_j ;
128 _pfldisk[_index] = _dim*_onedimallvaluesdiskoffset + _filterarrayfunc(filterarray,_i)*nvaluesperentity+_j ;
129 #ifdef _DEBUG_
130 printf("NoCmp :_fltmem[%d]=%llu \n",_index,_fltmem[_index]);
131 #endif
132 _index++;
133 }
134 }
135 }
136
137 if ( H5Sselect_elements(_memspace[0] ,H5S_SELECT_SET,_fltmemsize[0], HDF5_SELECT_BUG _fltmem ) <0) {
138 MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_MEMSPACE,MED_ERR_ID_MSG);
139 ISCRUTE_id(_memspace[0]);
140 goto ERROR;
141 }
142
143
144 if ( H5Sselect_elements(_diskspace[0] ,H5S_SELECT_SET,_pfldisksize[0], HDF5_SELECT_BUG _pfldisk ) <0) {
145 MED_ERR_(_ret,MED_ERR_SELECT,MED_ERR_DISKSPACE,MED_ERR_ID_MSG);
146 ISCRUTE_id(_diskspace[0]);
147 goto ERROR;
148 }
149
150 free(_fltmem);_fltmem=NULL;
151 free(_pfldisk);_pfldisk=NULL;
152
153 if ( _MEDsetFilter(1,_memspace, _diskspace, nentity,
154 nvaluesperentity, nconstituentpervalue,
155 constituentselect, MED_NO_INTERLACE,
156 filterarraysize,profilearraysize,
157 storagemode, profilename, filter ) <0) {
158 MED_ERR_(_ret,MED_ERR_INIT,MED_ERR_FILTER,"");
159 goto ERROR;
160 }
161
162 _ret = 0;
163
164 ERROR:
165
166 if (_fltmem) free(_fltmem);
167 if (_pfldisk) free(_pfldisk);
168
169 return _ret;
170 }
171