Malik,
It's good to hear from you! Hope you're doing well.
This really depends on how deep you personally want to go. In order to be familiar with Zapdos, you really don't need to have an incredibly in-depth understanding of FEM or C++. (That said, it certainly doesn't hurt to know more!) At the very least you should learn the basics of the following:
- How to turn an ODE/PDE into its weak form
- How to use .h and .C files
- Class inheritance
- How to write down Jacobians
Once you know those three things, I would highly recommend the tutorial that Corey linked to. It lists all of the equations that Zapdos solves. Alexander Lindsay's thesis is also in that directory, and Chapter 3 has a great description of the finite element method. I'd recommend converting the drift-diffusion equation into its weak form and then looking up the "ElectronTimeDerivative", "CoeffDiffusion", and "EFieldAdvection" kernels (in /zapdos/src/kernels/) to see how those terms are actually applied. (Keep in mind that Zapdos keeps the densities in logarithmic form, so that's why you'll see exponentials everywhere.) You don't need to be a master C++ programmer to know how to use Moose; you just need to understand the formatting of Moose's class templates and you'll learn as you go. Moose handles all of the numerical algorithms so you don't need to worry about that to get started.
As far as Moose and Zapdos go, there are a few things to keep in mind:
- nonlinear variables, material properties, and other terms that are spatially dependent are indexed by "_qp", which is the index of the quadrature point. It is essentially the spatial location of that term.
- In any kernel or boundary condition, you'll see a lot of variables that look like this: _u[_qp] The variable _u always refers to the variable that the kernel/BC/etc. is acting on.
- Materials are used to store and calculate information that is necessary for your solve but isn't a nonlinear variable. For example, in Zapdos all the transport coefficients (mobility, diffusivity) for each species are stored as material properties. So are rate coefficients if you have any reactions.
I find that the best way to learn how to use Moose and Zapdos is just to start using it. Don't get me wrong, those lecture videos are absolutely useful and I recommend watching them. Understanding how finite elements works will help you understand what Moose is doing in the background. But if your goal is to use Zapdos, it's best to just start using it. Most of the C++ you'll need to know can just be picked up by looking through all the other files in Moose and Zapdos.
I personally didn't watch all of those videos or take a class on C++ to get started, so I can't say exactly how many lectures you should watch.
Best,
Shane Keniley