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
20 #include <med.h>
21 #define MESGERR 1
22 #include "med_utils.h"
23
_identity(int i)24 static inline med_int _identity (int i) { return i; }
25 static const med_int * profilearray_global;
_withprofilearray(int i)26 static inline med_int _withprofilearray(int i) {
27 return (profilearray_global[i]-1);
28 }
29
30 /*Les données générées, le sont uniquement aux endroits utilisés */
generateFullIDatas(const int myrank,const int lastrank,const int sizeoftype,const med_storage_mode profilemode,const med_size profilesize,const med_int * const profilearray,const med_size start,const med_size stride,const med_size count,const med_size blocksize,const med_size lastblocksize,const int nentities,const int nvaluesperentity,const int nconstituentpervalue,med_float ** valuesarray)31 void generateFullIDatas(const int myrank, const int lastrank, const int sizeoftype,
32 const med_storage_mode profilemode, const med_size profilesize, const med_int * const profilearray,
33 const med_size start, const med_size stride, const med_size count, const med_size blocksize, const med_size lastblocksize,
34 const int nentities, const int nvaluesperentity, const int nconstituentpervalue,
35 med_float ** valuesarray ) {
36
37 med_size _start=start-1,_blockstart = 0,_blocksize=blocksize,_allblocksize=0,_index=0;
38 med_int (*_profilearrayfunc)(int)=0;
39 int _blocknum=0,_i=0,_j=0,_k=0;
40
41 profilearray_global = profilearray;
42
43 if (profilesize) {
44 if ( profilearray == NULL ) { MESSAGE("Error, profilesize > 0 && profilearray == 0"); }
45 MESSAGE("Using a profile...");
46 _profilearrayfunc = _withprofilearray;
47 } else {
48 _profilearrayfunc = _identity;
49 }
50
51 switch(profilemode) {
52
53 case MED_GLOBAL_STMODE :
54
55 /* ISCRUTE(lastblocksize); */
56 /*En mode global on n'a normalement pas besoin de prendre en compte les profils. Il ne peut pas y en avoir.
57 Celà n'a pas de sens sauf si la sélection demandée est un seul block !
58 Tous les processus possèdent le tableau global. */
59 *valuesarray = (med_float *) calloc(nentities*nvaluesperentity*nconstituentpervalue,sizeoftype);
60 for (_blocknum=0; _blocknum< count; ++_blocknum) {
61 _blockstart=_blocknum*stride;
62 /* ISCRUTE(_blockstart); */
63 if ( (count > 1) && (_blocknum == (count-1) ) && (myrank == lastrank) ) _blocksize=lastblocksize;
64 /* ISCRUTE(_blocksize); */
65 for (_i=0; _i<_blocksize; ++_i)
66 for (_j=0; _j < nvaluesperentity; ++_j)
67 for (_k=0; _k < nconstituentpervalue; ++_k) {
68 _index = _profilearrayfunc(_start+_blockstart+_i)*nvaluesperentity*nconstituentpervalue
69 +_j*nconstituentpervalue+_k;
70 (*valuesarray)[_index]= (myrank+1)*1000+_blocknum*100+_i+0.1*_j+0.01*_k;
71 /* ISCRUTE(_index); */
72 /* RSCRUTE((*valuesarray)[_index]); */
73
74 }
75 }
76 break;
77
78 case MED_COMPACT_STMODE :
79
80 /*Idem avec ou sans profil*/
81 if ( (myrank == lastrank) ) _allblocksize=blocksize*count+lastblocksize; else _allblocksize = blocksize*count;
82 *valuesarray = (med_float *) calloc(_allblocksize*nvaluesperentity*nconstituentpervalue,sizeoftype);
83
84 _index = 0;
85 for (_blocknum=0; _blocknum< count; ++_blocknum) {
86 if ( (count > 1) && (_blocknum == (count-1) ) && (myrank == lastrank) ) _blocksize=lastblocksize;
87 for (_i=0; _i<_blocksize; ++_i)
88 for (_j=0; _j < nvaluesperentity; ++_j)
89 for (_k=0; _k < nconstituentpervalue; ++_k) {
90 (*valuesarray)[_index]= (myrank+1)*1000+_blocknum*100+_i+0.1*_j+0.01*_k;
91 /* ISCRUTE(_index); */
92 /* RSCRUTE((*valuesarray)[_index]); */
93 _index++;
94 }
95 }
96
97 break;
98 default:
99 break;
100 }
101 }
102
generateNoIDatas(const int myrank,const int lastrank,const int sizeoftype,const med_storage_mode storagemode,const med_size profilearraysize,const med_int * const profilearray,const med_size start,const med_size stride,const med_size count,const med_size blocksize,const med_size lastblocksize,const int nentities,const int nvaluesperentity,const int nconstituentpervalue,med_float ** valuesarray)103 void generateNoIDatas(const int myrank, const int lastrank, const int sizeoftype,
104 const med_storage_mode storagemode, const med_size profilearraysize, const med_int * const profilearray,
105 const med_size start, const med_size stride, const med_size count, const med_size blocksize, const med_size lastblocksize,
106 const int nentities, const int nvaluesperentity, const int nconstituentpervalue,
107 med_float ** valuesarray ) {
108
109 med_size _start=start-1,_blockstart = 0,_blocksize=blocksize,_allblocksize=0,_index=0,_dim=0;
110 med_int (*_profilearrayfunc)(int)=0;
111 int _blocknum=0,_i=0,_j=0,_k=0;
112 profilearray_global = profilearray;
113
114 if (profilearraysize) {
115 MESSAGE("Using a profile...");
116 if ( profilearray == NULL ) {MESSAGE("Error, profilearraysize > 0 && profilearray == 0"); }
117 _profilearrayfunc = _withprofilearray;
118 } else {
119 _profilearrayfunc = _identity;
120 }
121
122 switch(storagemode) {
123
124 case MED_GLOBAL_STMODE :
125
126 /*En mode global on n'a normalement pas besoin de prendre en compte les profils. Il ne peut pas y en avoir.
127 Celà n'a pas de sens sauf si la sélection demandée est un seul block !
128 Tous les processus possèdent le tableau global. */
129 *valuesarray = (med_float *) calloc(nentities*nvaluesperentity*nconstituentpervalue,sizeoftype);
130
131 for (_dim=0; _dim< nconstituentpervalue; ++_dim) {
132 _blocksize = blocksize;
133 for (_blocknum=0; _blocknum< count; ++_blocknum) {
134 _blockstart=_blocknum*stride;
135 if ( (count > 1) && (_blocknum == (count-1) ) && (myrank == lastrank) ) _blocksize=lastblocksize;
136 for (_i=0; _i<_blocksize; ++_i)
137 for (_j=0; _j < nvaluesperentity; ++_j) {
138 _index = ( _dim*nentities
139 +_profilearrayfunc(_start+_blockstart+_i) )
140 *nvaluesperentity + _j;
141 (*valuesarray)[_index]= (myrank+1)*1000+_blocknum*100+_i+0.1*_j+0.01*_dim;
142 /* ISCRUTE(_index); */
143 /* RSCRUTE((*valuesarray)[_index]); */
144 }
145 }
146 }
147 break;
148
149 case MED_COMPACT_STMODE :
150 if ( (myrank == lastrank) ) _allblocksize=blocksize*count+lastblocksize; else _allblocksize = blocksize*count;
151 *valuesarray = (med_float *) calloc(_allblocksize*nvaluesperentity*nconstituentpervalue,sizeoftype);
152
153 _index = 0;
154 for (_dim=0; _dim< nconstituentpervalue; ++_dim) {
155 _blocksize = blocksize;
156 for (_blocknum=0; _blocknum< count; ++_blocknum) {
157 if ( (count > 1) && (_blocknum == (count-1) ) && (myrank == lastrank) ) _blocksize=lastblocksize;
158 for (_i=0; _i<_blocksize; ++_i)
159 for (_j=0; _j < nvaluesperentity; ++_j) {
160 (*valuesarray)[_index]= (myrank+1)*1000+_blocknum*100+_i+0.1*_j+0.01*_dim;
161 /* ISCRUTE(_index); */
162 /* RSCRUTE((*valuesarray)[_index]); */
163 _index++;
164 }
165 }
166 }
167
168 break;
169 default:
170 break;
171 }
172 }
173