void equelleGeneratedCode(equelle::EquelleRuntimeCPU& er) { using namespace equelle; ensureRequirements(er); // ============= Generated code starts here ================ const Scalar k = er.inputScalarWithDefault("k", double(0.3)); const SeqOfScalar timesteps = er.inputSequenceOfScalar("timesteps"); const CollOfScalar u0 = er.inputCollectionOfScalar("u_initial", er.allCells()); const CollOfFace dirichlet_boundary = er.inputDomainSubsetOf("dirichlet_boundary", er.boundaryFaces()); const CollOfScalar dirichlet_val = er.inputCollectionOfScalar("dirichlet_val", dirichlet_boundary); const CollOfScalar vol = er.norm(er.allCells()); const CollOfFace interior_faces = er.interiorFaces(); const CollOfCell first = er.firstCell(interior_faces); const CollOfCell second = er.secondCell(interior_faces); const CollOfScalar itrans = (k * (er.norm(interior_faces) / er.norm((er.centroid(first) - er.centroid(second))))); const CollOfFace bf = er.boundaryFaces(); const CollOfCell bf_cells = er.trinaryIf(er.isEmpty(er.firstCell(bf)), er.secondCell(bf), er.firstCell(bf)); const CollOfScalar bf_sign = er.trinaryIf(er.isEmpty(er.firstCell(bf)), er.operatorExtend(-double(1), bf), er.operatorExtend(double(1), bf)); const CollOfScalar btrans = (k * (er.norm(bf) / er.norm((er.centroid(bf) - er.centroid(bf_cells))))); const CollOfScalar dir_sign = er.operatorOn(bf_sign, er.boundaryFaces(), dirichlet_boundary); std::function<CollOfScalar(const CollOfScalar&)> computeInteriorFlux = [&](const CollOfScalar& u) -> CollOfScalar { return (-itrans * er.gradient(u)); }; std::function<CollOfScalar(const CollOfScalar&)> computeBoundaryFlux = [&](const CollOfScalar& u) -> CollOfScalar { const CollOfScalar u_dirbdycells = er.operatorOn(u, er.allCells(), er.operatorOn(bf_cells, er.boundaryFaces(), dirichlet_boundary)); const CollOfScalar dir_fluxes = ((er.operatorOn(btrans, er.boundaryFaces(), dirichlet_boundary) * dir_sign) * (u_dirbdycells - dirichlet_val)); return er.operatorExtend(dir_fluxes, dirichlet_boundary, er.boundaryFaces()); }; CollOfScalar expU; expU = u0; for (const Scalar& dt : timesteps) { std::function<CollOfScalar(const CollOfScalar&)> computeResidual = [&](const CollOfScalar& u) -> CollOfScalar { const CollOfScalar ifluxes = computeInteriorFlux(u); const CollOfScalar bfluxes = computeBoundaryFlux(u); const CollOfScalar fluxes = (er.operatorExtend(ifluxes, er.interiorFaces(), er.allFaces()) + er.operatorExtend(bfluxes, er.boundaryFaces(), er.allFaces())); const CollOfScalar residual = ((dt / vol) * er.divergence(fluxes)); return residual; }; expU = (expU - computeResidual(expU)); er.output("serial_expU", expU); er.output("maximum of u", er.maxReduce(expU)); } er.output("serial_expU", expU); // ============= Generated code ends here ================ }