Localising radiation source on one portion of mesh

Hi everyone,

I have a problem with the physical situation I am trying to model. Specifically, I have a cylindrical rod that I am heating the top of the rod with a Gaussian laser with a peak power of 400W in order to find the steady state temperature distribution around the rod. Therefore, the equation for the heat flux of my laser is:

P(x,y,z) = \frac{2AP_{max}}{m}\exp{-\frac{r^2}{w^2}}\exp{-\frac{z^2}{w_2^2}}

Where A is the absorptivity of the rod, P_{Max} is the peak power of the laser, m is the mass of the rod, w is the width of the Gaussian beam and w_2 is the width of said beam along the z direction (I have set this to be very small such that the beam is incident on the top surface, but I am unsure if this is correct).

Whilst this seemingly works well, my results send up not replicating the experiments I have performed, wherein I found a significant temperature difference (of around 300K) between the top and bottom of the rod, but my result indicates little temperature difference. This leads me to suspect that I have done something wrong with localising the laser to just illuminate the top surface.

Is there a easy way to be able to insert the Gaussian beam to just hit the top of the rod, rather than having to localise it via the w_2 I used in the equation above. My full code is shown below:

from __future__ import print_function
from fenics import *
import numpy as np
import matplotlib.pyplot as plt
from dolfin import *
from mshr import *
from ufl import as_tensor
from ufl import Index
import math
import mshr

parameters["allow_extrapolation"] = True
parameters["form_compiler"]["cpp_optimize"] = True
set_log_level(20)

# SOLVE THE HEAT TRANSFER PROBLEM FOR A 3D TARGET

#--Dimensions in mm----
x0 = 0 
y0 = 0
z0 = 0
x1 = 4
y1 = 4
z1 = 8
#----------------
t_start = 0.0
t_end = 200
nstep = 200
dtime = (t_end - t_start)/ nstep  #time step
#-----------------
#Configure for dimensions of system
#----------THERMAL--PROPERTIES--[Element: W]--------
kappa = 0.0172         #conductivity [W/mm K] 
c = 0.132         #Specific Heat Capacity [J/gK]
rho = 0.01925         #Density [g/mm^3]
const = kappa /(c * rho)
tau_T = 0.0 #Temperature Gradient Lag
tau_q = 0.0 #Heat Flux Lag
#---------------------------------------


pi = 3.141592653589793
T_am = 298 #ambient vacuum temperature (K)
T_a4 = T_am**4
epsilon = 0.1  # material emissivity
sigma = 5.67E-14 # W/(mm**2.K**4)
es = epsilon*sigma
Pmax = 400 #peak power of laser in W
w = 0.5
R = 1.5     #mm
area = pi*R*R  #area of target
depth = 8.0 #thickness of target
volume = area * depth #define a disk through which the laser is absorbed
Pden = Pmax / (volume* rho) #need to deine the power per g to balance units
absorb_depth = 1e-6

Laser = Expression('2*A*Pden*exp(-pow((x[0] - 0), 2)/(w*w)-pow((x[1]-0), 2)/(w*w)-pow((x[2]-0), 2)/(w2*w2) )',degree=3, A=epsilon, Pden=Pden,w= 0.5, w2= absorb_depth,z1=z1) #power (w2 localises the z-coordinates)
#A =! emissivity for system in thermal equillibrium

geometry = mshr.Cylinder(Point(0,0,0),Point(0,0,-8),R,R) #8mm long target 
 
# Create mesh
mesh = generate_mesh(geometry, 40)          # generate a mesh from the given geometry
#mesh = BoxMesh(Point(x0,y0,z0), Point(x1,y1,z1), 10,10,20)    #create the mesh over which we shall work
Space = FunctionSpace((mesh), 'P', 1)      #define finite element function space, defined via basis functions
VectorSpace = VectorFunctionSpace(mesh, 'P', 1)
cells = MeshFunction('size_t',mesh,mesh.topology().dim()) #codimension of 0
facets = MeshFunction('size_t',mesh,mesh.topology().dim()-1) #codimension of 1
da = Measure('ds', domain=mesh, subdomain_data = facets)  #area element
dv = Measure('dx', domain=mesh, subdomain_data = cells)   #volume element

initial_T = Expression("Tini", Tini=T_am, degree=3) # extrapolate an expression for the temperature before heating
T0 = interpolate(initial_T, Space)
T = Function(Space)         # Temperature
V = TestFunction(Space)     # Test Function used for FEA
dT = TrialFunction(Space)   # Temperature Derivative
q0 = Function(VectorSpace)  
i = Index()
G = as_tensor(T.dx(i), (i))  #gradient of T
G0 = as_tensor(T0.dx(i), (i)) # gradient of T at previous time step 

q = as_tensor(dtime/(dtime + tau_q) * (tau_q/dtime*q0[i] - kappa*(1+tau_T/dtime)*G[i] + kappa*tau_T/dtime*G0[i]),(i)) #heat
F = (rho*c/dtime*(T-T0)*V - q[i]*V.dx(i) - rho*Laser*V ) * dv + es*(T**4 - T_a4)*V*da   #final form to solve
Gain = derivative(F, T, dT)    # Gain will be usedas the Jacobian required to determine the evolution of a dynamic system 

file_T = File('target3D/solution.pvd')
for t in np.arange(t_start,t_end,dtime):
	print( "Time", t)
	solve(F==0, T, [], J = Gain, solver_parameters={"newton_solver":{"linear_solver": "mumps", "relative_tolerance": 1e-3} }, form_compiler_parameters={"cpp_optimize": True, "representation": "quadrature","quadrature_degree": 2} )
	file_T << (T,t)
	q0 = project(q, VectorSpace)
	T0.assign(T)      #change so that T0 is equal to T for the next time step

Thank you in advance

To me, it is not clear why all terms in the exponent are multipled by two, as that is not the case in the definition of P.