I assumed you had some sort of interpolation scheme for your data so you could query it at any x,y,z,t. You would read your data in in the Material and then evaluate it at _q_points during computeMaterialProperties().
Let me be clear:
1. Create a new Material by inheriting from Material
2. Code C++ in that Material to read in your external data
3. Code C++ in that Material to evaluate your data at any x,y,z,t position.
4. Create a function called evaluateThermalConductivity() that takes a Point and returns the thermal conductivity by evaluating your data at that point.
5. Create a function called evaluatePowerDensity() that takes a Point and returns the power density at that point
6. Use declareMaterialProperty() in your Material to declare a property named "thermal_conductivity" and another named "power_density"
7. Code computeMaterialProperties() to call evaluateThermalConductivity() and evaluatePowerDensity()... passing in _q_point[_qp] as the Point and assign those values to thermal_conductivity and power_density
8. Use the HeatConduction Kernel from the heat_conduction module
9. Create a new Kernel called PowerDensitySource that uses getMaterialProperty("power_density") to get the power density from the Material and applies it as a source term in your PDE (usually it will be something like _test[_i][_qp] * _power_density ).
10. ...
11. Profit!
Once you have that working you can think about possibly moving steps 2, 3, 4 into a GeneralUserObject to hold the data instead of a Material. That will give you more flexibility on how the data can be used (and use less memory). But get it working like the above first.
Derek