working model in 1D with only density

parent 162e68e0
{
"resolution" : 100,
"system_size" : 1,
"elasticity" : 1.0,
"viscosity" : 1.0,
"zero_rho_boundary": false,
"friction" : 1.0,
"lamda": -5.0,
"diffusion_rho" : 1.0,
"turnover_rho" : 2.0,
"average_rho" : 1.0,
"saturation_rho" : 1.0,
"noise_level": 0.0,
"timestep" : 0.01,
"savetime": 0.1,
"maxtime" : 10.0
}
\ No newline at end of file
import numpy as np
import dolfin as df
import progressbar
import os
import h5py
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
df.set_log_level(df.LogLevel.ERROR)
df.parameters['form_compiler']['optimize'] = True
class Tissue(object):
def __init__(self, parameters):
# read in parameters
for key in parameters:
setattr(self, key, parameters[key])
self.mesh = df.IntervalMesh(self.resolution,
-self.system_size/2,
self.system_size/2)
scalar_element = df.FiniteElement('P', self.mesh.ufl_cell(), 1)
vector_element = df.VectorElement('P', self.mesh.ufl_cell(), 1)
# u, v, rho
mixed_element = df.MixedElement([vector_element,
vector_element,
scalar_element])
# define function space with this mixed element
self.function_space = df.FunctionSpace(self.mesh, mixed_element)
if self.zero_rho_boundary:
self.rho_boundary = 0.0
else:
self.rho_boundary = self.average_rho
self.bc = df.DirichletBC(self.function_space.sub(2),
df.Constant(self.rho_boundary),
'on_boundary')
self.function0 = df.Function(self.function_space)
self.function = df.Function(self.function_space)
def advection(self, conc, vel, tconc):
return df.inner(df.div(vel * conc), tconc)
def active_stress(self, rho):
return (self.lamda * rho/(rho + self.saturation_rho)
* df.Identity(1))
def epsilon(self, v):
return df.sym(df.nabla_grad(v))
def passive_stress(self, u, v):
eps_u, eps_v = self.epsilon(u), self.epsilon(v)
elastic_stress = self.elasticity * eps_u
viscous_stress = self.viscosity * eps_v
return (elastic_stress + viscous_stress)
def stress(self, u, v, rho):
return (self.passive_stress(u, v) + self.active_stress(rho))
def diffusion_reaction_rho(self, rho, trho):
# NOTE: implement a step-function of density in the reaction
return (self.diffusion_rho * df.inner(df.nabla_grad(rho),
df.nabla_grad(trho))
+ self.turnover_rho * df.inner(rho - self.average_rho,
trho)
)
def setup_initial_conditions(self):
zero_vector = df.Constant((0.0,))
u0 = df.interpolate(zero_vector,
self.function_space.sub(0).collapse())
if self.zero_rho_boundary:
base_rho = 0.0
else:
base_rho = self.average_rho
rho0 = df.interpolate(df.Expression(
'base_rho + cos(PI*x[0]/L)',
L=self.system_size,
base_rho=base_rho,
degree=1, PI=np.pi),
self.function_space.sub(2).collapse())
# add noise
noise_rho = (self.noise_level
* (2 * np.random.random(rho0.vector().size()) - 1))
rho0.vector()[:] = rho0.vector()[:] + noise_rho
VFS = self.function_space.sub(1).collapse()
v0 = df.Function(VFS)
tv = df.TestFunction(VFS)
vform = (self.friction * df.inner(v0, tv)
+ df.inner(self.stress(u0, v0, rho0),
self.epsilon(tv))
) * df.dx
df.solve(vform == 0, v0)
df.assign(self.function0, [u0, v0, rho0])
def setup_weak_forms(self):
u0, v0, rho0 = df.split(self.function0)
u, v, rho = df.split(self.function)
tu, tv, trho = df.TestFunctions(self.function_space)
uform = (df.inner((u - u0)/self.timestep, tu)
- df.inner(v0, tu))
vform = (self.friction * df.inner(v, tv)
+ df.inner(self.stress(u, v, rho),
self.epsilon(tv)))
rhoform = (df.inner((rho - rho0)/self.timestep, trho)
+ self.advection(rho0, v0, trho)
+ self.diffusion_reaction_rho(rho, trho))
self.form = (uform + vform + rhoform) * df.dx
def solve(self, DIR=''):
self.uFile = df.XDMFFile(os.path.join(DIR,
'%s_displacement.xdmf' % self.timestamp))
self.vFile = df.XDMFFile(os.path.join(DIR,
'%s_velocity.xdmf' % self.timestamp))
self.rhoFile = df.XDMFFile(os.path.join(DIR,
'%s_density.xdmf' % self.timestamp))
self.setup_initial_conditions()
self.setup_weak_forms()
# time-variables
self.time = 0.0
savesteps = int(self.savetime/self.timestep)
maxsteps = int(self.maxtime/self.timestep)
u, v, rho = self.function0.split(deepcopy=True)
self.uFile.write_checkpoint(u, 'displacement', self.time)
self.vFile.write_checkpoint(v, 'velocity', self.time)
self.rhoFile.write_checkpoint(rho, 'density', self.time)
for steps in progressbar.progressbar(range(1, maxsteps + 1)):
df.solve(self.form == 0, self.function, self.bc)
self.function0.assign(self.function)
self.time += self.timestep
u, v, rho = self.function0.split(deepcopy=True)
if steps % savesteps == 0:
self.uFile.write_checkpoint(u, 'displacement',
self.time, append=True)
self.vFile.write_checkpoint(v, 'velocity',
self.time, append=True)
self.rhoFile.write_checkpoint(rho, 'density',
self.time, append=True)
# move mesh
dr = df.project(v*self.timestep, self.function_space.sub(0).collapse())
df.ALE.move(self.mesh, dr)
self.uFile.close()
self.vFile.close()
self.rhoFile.close()
def viz_tissue(params, DIR=''):
savesteps = int(params['maxtime']/params['savetime'])
times = np.arange(savesteps+1) * params['savetime']
# Read mesh geometry from h5 file
var = 'density'
h5 = h5py.File(os.path.join(DIR,
'%s_%s.h5' % (params['timestamp'], var)), "r")
# should be in the loop if remeshing
topology = np.array(h5['%s/%s_0/mesh/topology'%(var,var)])
geometry = []
for i in range(len(times)):
geometry.append(np.array(h5['%s/%s_%d/mesh/geometry'%(var,var,i)]))
h5.close()
geometry = np.array(geometry)
geometry, zeros= np.dsplit(geometry, 2)
mesh = df.IntervalMesh(params['resolution'],
-params['system_size']/2,
params['system_size']/2)
# Read data
u = np.zeros((len(times), mesh.num_vertices(), 1))
v = np.zeros_like(u)
rho = np.zeros((len(times), mesh.num_vertices()))
uFile = df.XDMFFile(os.path.join(DIR,
'%s_displacement.xdmf' % params['timestamp']))
vFile = df.XDMFFile(os.path.join(DIR,
'%s_velocity.xdmf' % params['timestamp']))
rhoFile = df.XDMFFile(os.path.join(DIR,
'%s_density.xdmf' % params['timestamp']))
# Reading data
print('Reading data...')
for steps in progressbar.progressbar(range(savesteps+1)):
mesh.coordinates()[:] = geometry[steps]
SFS = df.FunctionSpace(mesh, 'P', 1)
VFS = df.VectorFunctionSpace(mesh, 'P', 1)
ui, vi, rhoi = df.Function(VFS), df.Function(VFS), df.Function(SFS)
uFile.read_checkpoint(ui, 'displacement', steps)
vFile.read_checkpoint(vi, 'velocity', steps)
rhoFile.read_checkpoint(rhoi, 'density', steps)
u_vec = ui.compute_vertex_values(mesh)
u[steps] = u_vec.reshape(1, int(u_vec.shape[0])).T
v_vec = vi.compute_vertex_values(mesh)
v[steps] = v_vec.reshape(1, int(v_vec.shape[0])).T
rho[steps] = rhoi.compute_vertex_values(mesh)
uFile.close()
vFile.close()
rhoFile.close()
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(8,8))
axes[-1].set_xlabel(r'$x$')
axes[0].set_ylabel(r'$\rho$')
axes[1].set_ylabel(r'$v$')
axes[0].set_xlim(np.min(geometry), np.max(geometry))
axes[0].set_ylim(np.min(rho), np.max(rho))
axes[1].set_ylim(np.min(v), np.max(v))
rhoplot, = axes[0].plot(geometry[0], rho[0], 'g-', ms=3)
velplot, = axes[1].plot(geometry[0], v[0], 'r-', ms=3)
def update(value):
ti = np.abs(times-value).argmin()
rhoplot.set_ydata(rho[ti])
rhoplot.set_xdata(geometry[ti])
velplot.set_ydata(v[ti])
velplot.set_xdata(geometry[ti])
plt.draw()
sax = plt.axes([0.1, 0.92, 0.7, 0.02])
slider = Slider(sax, r'$t/\tau$', min(times), max(times),
valinit=min(times), valfmt='%3.1f',
fc='#999999')
slider.drawon = False
slider.on_changed(update)
plt.show()
if __name__ == '__main__':
import json, datetime
assert os.path.isfile('parameters.json'), \
'parameters.json file not found'
# load the parameters
with open('parameters.json') as jsonFile:
params = json.load(jsonFile)
timestamp = '123456' #datetime.datetime.now().strftime("%d%m%y-%H%M%S")
params['timestamp'] = timestamp
tissue = Tissue(params)
tissue.solve()
with open(params['timestamp'] + '_parameters.json', "w") as fp:
json.dump(params, fp, indent=4)
viz_tissue(params)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment