@@ -136,8 +136,13 @@ def profiles_to_csv(self, output_path: Path):
136136class Simulation :
137137 sim_input : SimulationInput
138138 t_final : pint .Quantity
139- signal_irr : callable
140- signal_sparging : callable
139+ signal_irr : callable [pint .Quantity ]
140+ signal_sparging : callable [pint .Quantity ]
141+ profile_source_T : callable [pint .Quantity ] | None = None
142+
143+ def __post_init__ (self ):
144+ if self .profile_source_T is None :
145+ self .profile_source_T = lambda x : 1
141146
142147 def solve (self , dt : pint .Quantity | None = None , dx : pint .Quantity | None = None ):
143148 # unpack pint.Quantities
@@ -166,8 +171,10 @@ def solve(self, dt: pint.Quantity | None = None, dx: pint.Quantity | None = None
166171 )
167172 fdim = mesh .topology .dim - 1
168173 cg_el = basix .ufl .element ("Lagrange" , mesh .basix_cell (), degree = 1 , shape = (2 ,))
174+ profile_el = basix .ufl .element ("Lagrange" , mesh .basix_cell (), degree = 1 )
169175
170176 V = dolfinx .fem .functionspace (mesh , cg_el )
177+ V_profile = dolfinx .fem .functionspace (mesh , profile_el )
171178
172179 u = dolfinx .fem .Function (V )
173180 u_n = dolfinx .fem .Function (V )
@@ -179,14 +186,12 @@ def solve(self, dt: pint.Quantity | None = None, dx: pint.Quantity | None = None
179186 vel_x = u_g0 # TODO velocity should vary with hydrostatic pressure
180187 vel = dolfinx .fem .Constant (mesh , PETSc .ScalarType ([vel_x ]))
181188
182- """ vel = fem_func(U)
183- v,interpolate(lambda x: v0 + 2*x[0])"""
184-
185189 h_l_const = dolfinx .fem .Constant (mesh , PETSc .ScalarType (h_l ))
186190
187- gen_T2 = dolfinx .fem .Constant (
188- mesh , PETSc .ScalarType (source_T2 )
189- ) # generation term [mol T2 /m3/s]
191+ # gen_T2 = dolfinx.fem.Constant(
192+ # mesh, PETSc.ScalarType(source_T2)
193+ # ) # generation term [mol T2 /m3/s]
194+ gen_T2 = dolfinx .fem .Function (V_profile )
190195
191196 # VARIATIONAL FORMULATION
192197
@@ -277,7 +282,14 @@ def solve(self, dt: pint.Quantity | None = None, dx: pint.Quantity | None = None
277282 # SOLVE
278283 t = 0
279284 while t < t_final :
280- gen_T2 .value = source_T2 * self .signal_irr (t * ureg .s )
285+ gen_T2 .interpolate (
286+ lambda x : (
287+ x [0 ] * 0 # why do I need to put x[0] at all cost???
288+ + self .profile_source_T (x [0 ] * ureg .m )
289+ * source_T2
290+ * self .signal_irr (t * ureg .s )
291+ )
292+ )
281293 h_l_const .value = h_l * self .signal_sparging (t * ureg .s )
282294 """ utiliser ufl.conditional TODO"""
283295
@@ -298,8 +310,8 @@ def solve(self, dt: pint.Quantity | None = None, dx: pint.Quantity | None = None
298310 c_T2_solutions .append (c_T2_vals .copy ())
299311 y_T2_solutions .append (y_T2_vals .copy ())
300312 sources_T2 .append (
301- gen_T2 . value . copy ( ) * tank_volume
302- ) # total T generation rate in the tank [mol/s]
313+ source_T2 * self . signal_irr ( t * ureg . s ) * tank_volume
314+ ) # total T generation rate in the tank [mol/s] TODO useless: signal_irr is already given
303315
304316 flux_T2 = dolfinx .fem .assemble_scalar (
305317 dolfinx .fem .form (
0 commit comments