| 248 | } |
| 249 | |
| 250 | vector<string> GenerateSurfaceData( shared_ptr<MeshAccess> ma, |
| 251 | shared_ptr<CoefficientFunction> cf, |
| 252 | int order) { |
| 253 | // generate surface data |
| 254 | LocalHeapMem<100000> lh("webgui_surface_data"); |
| 255 | auto vb = ma->GetDimension() == 3 ? BND : VOL; |
| 256 | Array<double> surface_data; |
| 257 | auto comps = cf->Dimension(); |
| 258 | for (auto elnr : Range(ma->GetNElements(2))) { |
| 259 | HeapReset hr(lh); |
| 260 | |
| 261 | auto el = ma->GetElement({vb, elnr}); |
| 262 | auto &ir = GetElementPoints(el.GetType(), order); |
| 263 | auto &trafo = ma->GetTrafo(el, lh); |
| 264 | BaseMappedIntegrationRule &mir = trafo(ir, lh); |
| 265 | FlatMatrix<> values(ir.Size(), comps, lh); |
| 266 | cf->Evaluate(mir, values); |
| 267 | surface_data.Append( |
| 268 | FlatArray<double>(values.AsVector().Size(), values.Data())); |
| 269 | } |
| 270 | auto nip = GetElementPoints(ET_TRIG, order).Size(); |
| 271 | auto nel = surface_data.Size() / nip / |
| 272 | comps; // might be different from ma->GetNElements(2), because |
| 273 | // quads are divided into 2 trigs |
| 274 | FlatTensor<3, double> data(nel, nip, comps, surface_data.Data()); |
| 275 | return MapBernstein(data, ET_TRIG, order, cf->Dimension()); |
| 276 | } |
| 277 | |
| 278 | vector<string> GenerateVolumeData( shared_ptr<MeshAccess> ma, |
| 279 | shared_ptr<CoefficientFunction> cf, |
no test coverage detected