MCPcopy Create free account
hub / github.com/NGSolve/ngsolve / build_index_maps

Method build_index_maps

fem/tensorcoefficient.cpp:1181–1219  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1179 }
1180
1181 Matrix<int> EinsumCoefficientFunction::build_index_maps(
1182 const Array<MultiIndex>& index_sets, const optional<Vector<bool>>& nz_pattern)
1183 {
1184 Matrix<int> imaps;
1185
1186 const auto& RI = index_sets[cfs.Size()];
1187 const auto& FI = index_sets[cfs.Size() + 1];
1188 const auto cres = cfs.Size();
1189
1190 if (!nz_pattern)
1191 {
1192 imaps.SetSize(FI.TotalDim(), cfs.Size() + 1);
1193 for (size_t I: Range(imaps.Height()))
1194 {
1195 const auto I_array = split(I, FI);
1196 imaps(I, cres) = join(I_array, RI);
1197 for (size_t i: Range(cfs))
1198 imaps(I, i) = join(I_array, index_sets[i]);
1199 }
1200 }
1201 else
1202 {
1203 auto nnz = count(nz_pattern->Data(), nz_pattern->Data() + nz_pattern->Size(), true);
1204 imaps.SetSize(nnz, cfs.Size() + 1);
1205 size_t nzi = 0;
1206 for (size_t I: Range(FI.TotalDim()))
1207 {
1208 if (!(*nz_pattern)[I])
1209 continue;
1210
1211 const auto I_array = split(I, FI);
1212 imaps(nzi, cres) = join(I_array, RI);
1213 for (size_t i: Range(cfs))
1214 imaps(nzi, i) = join(I_array, index_sets[i]);
1215 ++nzi;
1216 }
1217 }
1218 return imaps;
1219 }
1220
1221 string EinsumCoefficientFunction::GetDescription() const
1222 {

Callers

nothing calls this directly

Calls 8

splitFunction · 0.85
joinFunction · 0.85
TotalDimMethod · 0.80
RangeFunction · 0.50
SizeMethod · 0.45
SetSizeMethod · 0.45
HeightMethod · 0.45
DataMethod · 0.45

Tested by

no test coverage detected