diff --git a/contrib/arc/DG.cpp b/contrib/arc/DG.cpp new file mode 100644 index 0000000000000000000000000000000000000000..089b9706f75b7946a88d9cffb384d217d62570c3 --- /dev/null +++ b/contrib/arc/DG.cpp @@ -0,0 +1,72 @@ +class groupOfElements{ + // tous les elements ont le meme nombre de points de gauss et le + // meme nombre de noeuds + + vector<MElement*> elements; + // 1) general case + // store Jacobian + det at all gauss points + + // or 2) quadrature free + // nothinto store +}; + +class MFaceWithAdditionalInfo : MFace{ + MElement *left, *right; // normales pointent vers ext�rieur du left + // ordre +}; + +class groupOfFaces{ + // toutes les faces ont le meme nombre de points points de gauss et + // le meme nombre de noeuds + + vector<MFaceWithAdditionalInfo*> faces; + // + // stockage normales � tous les points d'int�gration +}; + +class DG{ + DG(vector<groupOfElements*> &groups) + { + // if need to, loop over all elements and store gradients at nodes + } + void volumeResidual(vector<groupOfElements*> &groups, dofManager &dofs, + conservationLaw &law, vecteur &residual) + { + // pour chaque groupe: + // 1) calculer aux points de gauss toutes les variables (et leurs + // derivees si besoin est, using node gradients) + // 2) boucler sur les elements, calculer les flux et les stocker + // dans un gros vecteur fx, fy, fz (lineaire en #pts de gauss) + // 3) integrer (sommer) via blas 3 (quadratique) + // 4) premultiplier par inverse de matrice de masse + } + void boundaryResidual(vector<groupOfFaces*> &groups, dofManager &dofs, + conservationLaw &law, vecteur &residual) + { + // pour chaque groupe: + // 1) boucler sur les faces et evaluer les variables left et right + // aux points de colloc et stocker dans un gros vecteur + // 2) push sur les points de gauss + // 3) calculer les flux aux points de gauss + // 4) appeler riemanFlux avec left/right + // 5) integrer tout d'un coup via blas + } + // pour l'implicite: + void assemble() + { + + } +}; + +class conservationLaw { + void diffusionTerm(MElement*, integrationPoints, dataVec in[4], dataVec out[3]); + void convectionTerm(MElement*, integrationPoints, dataVec in, dataVec out[3]); + void massTerm(MElement*, integrationPoints, dataVec in, dataVec out); + void rhs(MElement*, integrationPoints, dataVec in, dataVec out); + void riemanFlux(MElement *ele[2], dataVec in[2], dataVec out); + void maxEigenValue(MElement *); + // pour le non-lin�aire si linearisation sans differences finies + void linearizeDiffusionFlux(); + void linearizeConvectionFlux(); +}; +