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