• [^] # Re: Comprendre le C++ ou OpenFoam ?

    Posté par . En réponse au message Je souhaite apprendre le C++. Évalué à 4. Dernière modification le 30 novembre 2021 à 14:01.

    Merci pour votre réponse.

    Souvent pour prendre en main un système de simulation, on commence par des cas concrets et simples ne nécessitant pas la prise en main du code au-delà de la simple obtention des exécutables. C'est un premier pas qui permet souvent de comprendre quels sont les points d'entrées dans le code qui nous intéressent et qui méritent d'être approfondis. Du coup si votre problématique nécessite de prendre en main OpenFoam pour y programmer de nouveaux modèles, peut-être avez-vous commencé par là ?

    Je maîtrise déjà l'usage d'OpenFoam. Je l'ai utilisé de nombreuses fois et j'ai codé mon propre solveur avec les fonctions de haut niveaux d'OpenFoam. C'est assez simple lorsqu'on ne se plonge pas dans les arcanes car la syntaxe d'OpenFoam est assez proche du langage naturelle mathérmique

    Par exemple pour écrire \nabla(\vec{u}\otimes\vec{u}) +\nabla(\nu\nabla\vec{u}) = - \nabla p on écrit :

    tmp<fvVectorMatrix> tUEqn
    (
     fvm::div(phi, U)
     + fvm::laplacian(nu,U)
    );
    fvVectorMatrix& UEqn = tUEqn.ref();
    solve(UEqn == -fvc::grad(p));

    C'est ainsi que j'ai pu facilement répondre à mes besoins basiques. Le problème c'est de comprendre le fonctionnement interne du code qui n'est pas encore tout à faire documenté. Je n'arrive pas à le lire. Par exemple j'aimerais savoir comment est calculé un fvc:div(U) quand U est du type volVectorField. Je comprends bien que cela se passe dans ce fichier https://www.openfoam.com/documentation/guides/latest/api/fvcDiv_8C_source.html vers les lignes 77 à 95 mais je n'arrive pas à remonter les différentes fonctions jusqu'à arriver à la somme des flux sur les faces (i.e \int_\Omega \text{div}(U) ~dV \approx \sum_i U_i S_i \vec{n_i} ~dV
    J'aimerais donc apprendre le C++ afin de me retrouver là dedans et pourquoi pas pouvoir coder mes propres classes de bas niveau dans OpenFoam pour mes besoin.

    De là où je suis, il me semble qu'il ne devrait rien y avoir de difficile là-dedans pour qui maîtrise déjà la programmation orientée objet en Python. À une exception prêt probablement : la maîtrise des pointeurs et références. Les idiosyncrasies de la syntaxe C++ rendant la chose plus complexe à bien saisir ; sachant que c'est souvent un problème pour les débutants. Sur ce sujet je recommanderai de commencer par bien comprendre la syntaxe C des pointeurs, puis de prendre un grand bol d'humilité soumise, et de se lancer dans les références C++.

    Justement, j'ai beaucoup de mal avec ces références et ces pointeurs. Je ne connais pas du tout le C. Est-ce qu'il faut vraiment passer par là ?

    Vous devriez rapidement y arriver à l'aide d'un manuel basique, et en cherchant à progresser par petites étapes plutôt qu'à franchir d'un coup l'obstacle. L'idée pour attaquer un gros problème de programmation est un peu la même qu'en modélisation physique : comment découper en éléments simples.

    Merci pour le conseil. Il faut que je me trouve une bonne référence et de bons exercices pour débuter.

    EDITAI par la modération: correction suite à la demande de Jojo qui s'est foiré sur son post :-)