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