la repo è costituita da due script principalmente:
- Il codice
MixedWF_CH.ipynb
,MixedWF_CH_v1.ipynb
eMixedWF_CH_v2.ipynb
in cui viene approcciato il problema non lineare$(1)$ , con risultati non adatti - Il codice
TN.ipynb
in cui viene approcciato un problema simile ma lineare$(2)$ , i risultati sembrano ok - Plot delle concentrazioni
$u,v$ inFreeFEM
Advection-Diffusion Eq
dove i termini non lineari sono:
and
IC
cioè distribuzioni pseudo-randomiche.
#Initial condtions (Random)
class IC(UserExpression):
def eval(self,values,x):
values[0] = 0.1*random() -0.1*random()
values[1] = 0.1*random() -0.1*random()
def value_shape(self):
return(2,)
Idea per l'implementazione delle funzioni ff, gg
in modo simbolico da poter usare nella formulazione debole:
#Define the forcing terms
u_n1 = variable(u_n1)
u_n2 = variable(u_n2)
ff = u_n1-alpha*u_n2+gamma*u_n1*u_n2-u_n1**3
gg = u_n1-beta*u_n2
in alternativa all'interno della formulazione debole, si accedono alle componenti di
u_n=Function(V)
u_n1, u_n2 =split(u_n)
usando u_n[0], u_n[1]
e scrivendo direttamente
F = (u_1*v_1/dt)*dx \
+ (u_2*v_2/dt)*dx \
+ inner(grad(u_1), grad(v_1))*dx \
+ d*inner(grad(u_2), grad(v_2))*dx \
-(dot(u_n1,v_1)/dt + dot(u_n2,v_2)/dt)*dx \
-(dot(u_n[0]-alpha*u_n[1]+gamma*u_n[0]*u_n[1]-u_n[0]**3,v_1) + dot(u_n[0]-beta*u_n[1],v_2))*dx
altrimenti
def ff(u_n1,u_n2):
return u_n1-A*u_n2+G*u_n1*u_n2-u_n1**3
def gg(u_n1,u_n2):
return u_n1-B*u_n2
# Define variational problem
F = (u_1*v_1/dt)*dx \
+ (u_2*v_2/dt)*dx \
+ inner(grad(u_1), grad(v_1))*dx \
+ d*inner(grad(u_2), grad(v_2))*dx \
-(dot(u_n1,v_1)/dt + dot(u_n2,v_2)/dt)*dx \
-(dot(ff(u_n1,u_n2),v_1) + dot(gg(u_n1,u_n2),v_2))*dx
E' risolto in 2 possibili modi, usando un solver non-lineare alternativo a Newton
, ovvero SNES
i quali i sistemi lineari sono risolti con GMRES+HYPRE_AMG (preconditioner)
la cui Forma debole (pagina 9)
la soluzione che ho ottenuto:
plot ottenuto attraverso il codice FreeFEM