I am currently working on a non linear magnetic problem where I need to define a BH curves that are different on each elements of a specific region.
This is a the simplified logic of my code. I create B and H list for each element. Then, for each element a BSpline is created along with the analytical formulation depending on this Bspline.
fes_tau = L2(mesh, order = 0)
for el in mesh.Elements() :
B_data[el.nr] = …
# logic to compute B list depending on the element. H list doesnt change
for el in elements :
gf_indice_mesh = GridFunction(fes_tau) # grid function created to define formulation on 1 element
gf_indice_mesh.vec.data[el.nr] = 1 # grid function = 1 on current element, 0 elswere
hb_curve = BSpline(2, ++list(B_data[el.nr]), +list(H))
energy_dens = hb_curve.Integrate() # BSpline created for each elemeent
aEnergy += SymbolicEnergy(gf_indice_mesh*energy_dens(sqrt(1e-12+grad(u)*grad(u)))*ng_fea.gf_scale, definedon=mesh.Materials(material_name_to_study)) # formulation defined on 1 element
This method is functionnal, however very time consuming. I have thus two questions :
1 - Defining stuff on elements
Is there a more convinient way to define CoefficientFunctions or SumOfIntegrals objects on elements.
2 - Solving Time
Secondly, the computation time to solve such problem is very high. By this I mean the computation time of the solver nonlinear iteration. Is there any way to improve it ?
Thanks in advance,