From 1768a6371f6ce729f3046cb4ff8f15be4ea5a98b Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Mon, 23 Jun 2025 11:09:43 -0700 Subject: [PATCH 01/25] Allow use of additional keys to store information about subdomains in mesh, include 2d mesh creation in xy plane (removing z coord in gmsh) --- smart/mesh.py | 37 +++++- smart/mesh_tools.py | 287 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 322 insertions(+), 2 deletions(-) diff --git a/smart/mesh.py b/smart/mesh.py index 96774ce..ba93abd 100644 --- a/smart/mesh.py +++ b/smart/mesh.py @@ -152,6 +152,10 @@ class ParentMesh(_Mesh): as an xml or xdmf file containing a vertex mesh function of type double extra_keys (list): list of names of extra keys to load from hdf5 mesh file, specifying other subdomains besides main compartments (optional) + key_for_cells (string): a string specifying the extra key to use as a + mesh function to define cell markers in mesh (optional) + key_for_facets (string): a string specifying the extra key to use as a + mesh function to define facet markers in mesh (optional) """ mesh_filename: str @@ -161,6 +165,8 @@ class ParentMesh(_Mesh): use_partition: bool curvature: d.MeshFunction extra_keys: list = [] + key_for_cells: str = "" + key_for_facets: str = "" def __init__( self, @@ -171,6 +177,8 @@ def __init__( mpi_comm=d.MPI.comm_world, curvature=None, extra_keys=[], + key_for_cells="", + key_for_facets="", ): super().__init__(name) self.use_partition = use_partition @@ -202,6 +210,30 @@ def __init__( # Otherwise just take what we got self.curvature = curvature + # set cells and/or facets according to extra keys if applicable + if key_for_cells != "": + try: + idx = self.extra_keys.index(key_for_cells) + except ValueError: + raise ValueError(f"'{key_for_cells}' does not match an extra key") + assert self.subdomains[idx].dim() == self.dimensionality, ( + f"Mesh function associated with '{key_for_cells}' " + "does not match mesh cell dimension" + ) + self.mf["cells"] = self.subdomains[idx] + logger.info(f"Cell mesh function loaded from key '{key_for_cells}'") + if key_for_facets != "": + try: + idx = self.extra_keys.index(key_for_facets) + except ValueError: + raise ValueError(f"'{key_for_cells}' does not match an extra key") + assert self.subdomains[idx].dim() == self.dimensionality - 1, ( + f"Mesh function associated with '{key_for_facets}' " + "does not match mesh facet dimension" + ) + self.mf["facets"] = self.subdomains[idx] + logger.info(f"Facet mesh function loaded from key '{key_for_facets}'") + def get_mesh_from_id(self, id): "Find the mesh that has the matching id." # find the mesh in that has the matching id @@ -290,8 +322,9 @@ def read_parent_mesh_functions_from_file(self): assert len(self.child_meshes) > 0 # Init mesh functions - self.mf["cells"] = self._read_parent_mesh_function_from_file(volume_dim) - if self.has_surface: + if "cells" not in self.mf.keys(): + self.mf["cells"] = self._read_parent_mesh_function_from_file(volume_dim) + if self.has_surface and "facets" not in self.mf.keys(): self.mf["facets"] = self._read_parent_mesh_function_from_file(surface_dim) # If any cell markers are given as a list we also create mesh diff --git a/smart/mesh_tools.py b/smart/mesh_tools.py index e1a700a..fb04478 100644 --- a/smart/mesh_tools.py +++ b/smart/mesh_tools.py @@ -1300,6 +1300,291 @@ def meshSizeCallback(dim, tag, x, y, z, lc): return (dmesh, mf2, mf3) +def create_2Dcell_xy( + outerExpr: str = "", + innerExpr: str = "", + hEdge: float = 0, + hInnerEdge: float = 0, + interface_marker: int = 12, + outer_marker: int = 10, + inner_tag: int = 2, + outer_tag: int = 1, + comm: MPI.Comm = d.MPI.comm_world, + verbose: bool = False, + half_cell: bool = True, + return_curvature: bool = False, +) -> Tuple[d.Mesh, d.MeshFunction, d.MeshFunction]: + """ + Creates a 2D mesh of a cell profile, with the bounding curve defined in + terms of r and z (e.g. unit circle would be "r**2 + (z-1)**2 - 1) + It is assumed that substrate is present at z = 0, so if the curve extends + below z = 0 , there is a sharp cutoff. + If half_cell = True, only have of the contour is constructed, with a + left zero-flux boundary at r = 0. + Can include one compartment inside another compartment. + Recommended for use with the axisymmetric feature of SMART. + + Args: + outerExpr: String implicitly defining an r-z curve for the outer surface + innerExpr: String implicitly defining an r-z curve for the inner surface + hEdge: maximum mesh size at the outer edge + hInnerEdge: maximum mesh size at the edge + of the inner compartment + interface_marker: The value to mark facets on the interface with + outer_marker: The value to mark facets on edge of the outer ellipse with + inner_tag: The value to mark the inner ellipse surface with + outer_tag: The value to mark the outer ellipse surface with + comm: MPI communicator to create the mesh with + verbose: If true print gmsh output, else skip + half_cell: If true, consider r=0 the symmetry axis for an axisymm shape + Returns: + Tuple (mesh, facet_marker, cell_marker) + """ + import gmsh + + if outerExpr == "": + ValueError("Outer surface is not defined") + + if return_curvature: + # create full mesh for curvature analysis and then map onto half mesh + # if half_cell_with_curvature is True + half_cell_with_curvature = half_cell + half_cell = False + + rValsOuter, zValsOuter = implicit_curve(outerExpr) + + if not innerExpr == "": + rValsInner, zValsInner = implicit_curve(innerExpr) + zMid = np.mean(zValsInner) + ROuterVec = np.sqrt(rValsOuter**2 + (zValsOuter - zMid) ** 2) + RInnerVec = np.sqrt(rValsInner**2 + (zValsInner - zMid) ** 2) + maxOuterDim = max(ROuterVec) + maxInnerDim = max(RInnerVec) + else: + zMid = np.mean(zValsOuter) + ROuterVec = np.sqrt(rValsOuter**2 + (zValsOuter - zMid) ** 2) + maxOuterDim = max(ROuterVec) + if np.isclose(hEdge, 0): + hEdge = 0.1 * maxOuterDim + if np.isclose(hInnerEdge, 0): + hInnerEdge = 0.2 * maxOuterDim if innerExpr == "" else 0.2 * maxInnerDim + # Create the 2D mesh using gmsh + gmsh.initialize() + gmsh.option.setNumber("General.Terminal", int(verbose)) + gmsh.model.add("2DCell") + # first add outer body and revolve + outer_tag_list = [] + for i in range(len(rValsOuter)): + cur_tag = gmsh.model.occ.add_point(rValsOuter[i], zValsOuter[i], 0.0) + outer_tag_list.append(cur_tag) + outer_spline_tag = gmsh.model.occ.add_spline(outer_tag_list) + if not half_cell: + outer_tag_list2 = [] + for i in range(len(rValsOuter)): + cur_tag = gmsh.model.occ.add_point(-rValsOuter[i], zValsOuter[i], 0.0) + outer_tag_list2.append(cur_tag) + outer_spline_tag2 = gmsh.model.occ.add_spline(outer_tag_list2) + if np.isclose(zValsOuter[-1], 0): # then include substrate at z=0 + if half_cell: + origin_tag = gmsh.model.occ.add_point(0, 0, 0) + symm_axis_tag = gmsh.model.occ.add_line(origin_tag, outer_tag_list[0]) + bottom_tag = gmsh.model.occ.add_line(origin_tag, outer_tag_list[-1]) + outer_loop_tag = gmsh.model.occ.add_curve_loop( + [outer_spline_tag, bottom_tag, symm_axis_tag] + ) + else: + bottom_tag = gmsh.model.occ.add_line(outer_tag_list[-1], outer_tag_list2[-1]) + outer_loop_tag = gmsh.model.occ.add_curve_loop( + [outer_spline_tag, outer_spline_tag2, bottom_tag] + ) + else: + if half_cell: + symm_axis_tag = gmsh.model.occ.add_line(outer_tag_list[0], outer_tag_list[-1]) + outer_loop_tag = gmsh.model.occ.add_curve_loop([outer_spline_tag, symm_axis_tag]) + else: + outer_loop_tag = gmsh.model.occ.add_curve_loop([outer_spline_tag, outer_spline_tag2]) + cell_plane_tag = gmsh.model.occ.add_plane_surface([outer_loop_tag]) + + if innerExpr == "": + # No inner shape in this case + gmsh.model.occ.synchronize() + gmsh.model.add_physical_group(2, [cell_plane_tag], tag=outer_tag) + facets = gmsh.model.getBoundary([(2, cell_plane_tag)]) + facet_tag_list = [] + for i in range(len(facets)): + facet_tag_list.append(facets[i][1]) + if half_cell: # if half, set symmetry axis to 0 (no flux) + xmin, ymin, zmin = (-hInnerEdge / 10, -1, -hInnerEdge / 10) + xmax, ymax, zmax = (hInnerEdge / 10, max(zValsOuter) + 1, hInnerEdge / 10) + all_symm_bound = gmsh.model.occ.get_entities_in_bounding_box( + xmin, ymin, zmin, xmax, ymax, zmax, dim=1 + ) + symm_bound_markers = [] + for i in range(len(all_symm_bound)): + symm_bound_markers.append(all_symm_bound[i][1]) + gmsh.model.add_physical_group(1, symm_bound_markers, tag=0) + gmsh.model.add_physical_group(1, facet_tag_list, tag=outer_marker) + else: + # Add inner shape + inner_tag_list = [] + for i in range(len(rValsInner)): + cur_tag = gmsh.model.occ.add_point(rValsInner[i], zValsInner[i], 0.0) + inner_tag_list.append(cur_tag) + inner_spline_tag = gmsh.model.occ.add_spline(inner_tag_list) + if half_cell: + symm_inner_tag = gmsh.model.occ.add_line(inner_tag_list[0], inner_tag_list[-1]) + inner_loop_tag = gmsh.model.occ.add_curve_loop([inner_spline_tag, symm_inner_tag]) + else: + inner_tag_list2 = [] + for i in range(len(rValsInner)): + cur_tag = gmsh.model.occ.add_point(-rValsInner[i], zValsInner[i], 0.0) + inner_tag_list2.append(cur_tag) + inner_spline_tag2 = gmsh.model.occ.add_spline(inner_tag_list2) + inner_loop_tag = gmsh.model.occ.add_curve_loop([inner_spline_tag, inner_spline_tag2]) + inner_plane_tag = gmsh.model.occ.add_plane_surface([inner_loop_tag]) + cell_plane_list = [cell_plane_tag] + inner_plane_list = [inner_plane_tag] + + outer_volume = [] + inner_volume = [] + all_volumes = [] + inner_marker_list = [] + outer_marker_list = [] + for i in range(len(cell_plane_list)): + cell_plane_tag = cell_plane_list[i] + inner_plane_tag = inner_plane_list[i] + # Create interface between 2 objects + two_shapes, (outer_shape_map, inner_shape_map) = gmsh.model.occ.fragment( + [(2, cell_plane_tag)], [(2, inner_plane_tag)] + ) + gmsh.model.occ.synchronize() + + # Get the outer boundary + outer_shell = gmsh.model.getBoundary(two_shapes, oriented=False) + for i in range(len(outer_shell)): + outer_marker_list.append(outer_shell[i][1]) + # Get the inner boundary + inner_shell = gmsh.model.getBoundary(inner_shape_map, oriented=False) + for i in range(len(inner_shell)): + inner_marker_list.append(inner_shell[i][1]) + for tag in outer_shape_map: + all_volumes.append(tag[1]) + for tag in inner_shape_map: + inner_volume.append(tag[1]) + + for vol in all_volumes: + if vol not in inner_volume: + outer_volume.append(vol) + + # Add physical markers for facets + if half_cell: # if half, set symmetry axis to 0 (no flux) + xmin, ymin, zmin = (-hInnerEdge / 10, -1, -hInnerEdge / 10) + xmax, ymax, zmax = (hInnerEdge / 10, max(zValsOuter) + 1, hInnerEdge / 10) + all_symm_bound = gmsh.model.occ.get_entities_in_bounding_box( + xmin, ymin, zmin, xmax, ymax, zmax, dim=1 + ) + symm_bound_markers = [] + for i in range(len(all_symm_bound)): + symm_bound_markers.append(all_symm_bound[i][1]) + # note that this first call sets the symmetry axis to tag 0 and + # this is not overwritten by the next calls to add_physical_group + gmsh.model.add_physical_group(1, symm_bound_markers, tag=0) + gmsh.model.add_physical_group(1, outer_marker_list, tag=outer_marker) + gmsh.model.add_physical_group(1, inner_marker_list, tag=interface_marker) + + # Physical markers for "volumes" + gmsh.model.add_physical_group(2, outer_volume, tag=outer_tag) + gmsh.model.add_physical_group(2, inner_volume, tag=inner_tag) + + def meshSizeCallback(dim, tag, x, y, z, lc): + # mesh length is hEdge at the PM and hInnerEdge at the inner membrane + # between these, the value is interpolated based on the relative distance + # between the two membranes. + # Inside the inner shape, the value is interpolated between hInnerEdge + # and lc3, where lc3 = max(hInnerEdge, 0.2*maxInnerDim) + # if innerRad=0, then the mesh length is interpolated between + # hEdge at the PM and 0.2*maxOuterDim in the center + rCur = np.sqrt(x**2 + z**2) + RCur = np.sqrt(rCur**2 + (y - zMid) ** 2) + outer_dist = np.sqrt((rCur - rValsOuter) ** 2 + (z - zValsOuter) ** 2) + np.append(outer_dist, z) # include the distance from the substrate + dist_to_outer = min(outer_dist) + if innerExpr == "": + lc3 = 0.2 * maxOuterDim + dist_to_inner = RCur + in_outer = True + else: + inner_dist = np.sqrt((rCur - rValsInner) ** 2 + (y - zValsInner) ** 2) + dist_to_inner = min(inner_dist) + inner_idx = np.argmin(inner_dist) + inner_rad = RInnerVec[inner_idx] + R_rel_inner = RCur / inner_rad + lc3 = max(hInnerEdge, 0.2 * maxInnerDim) + in_outer = R_rel_inner > 1 + lc1 = hEdge + lc2 = hInnerEdge + if in_outer: + lcTest = lc1 + (lc2 - lc1) * (dist_to_outer) / (dist_to_inner + dist_to_outer) + else: + lcTest = lc2 + (lc3 - lc2) * (1 - R_rel_inner) + return lcTest + + gmsh.model.mesh.setSizeCallback(meshSizeCallback) + # set off the other options for mesh size determination + gmsh.option.setNumber("Mesh.MeshSizeExtendFromBoundary", 0) + gmsh.option.setNumber("Mesh.MeshSizeFromPoints", 0) + gmsh.option.setNumber("Mesh.MeshSizeFromCurvature", 0) + # this changes the algorithm from Frontal-Delaunay to Delaunay, + # which may provide better results when there are larger gradients in mesh size + gmsh.option.setNumber("Mesh.Algorithm", 5) + + gmsh.model.mesh.generate(2) + rank = MPI.COMM_WORLD.rank + tmp_folder = pathlib.Path(f"tmp_2DCell_{rank}") + tmp_folder.mkdir(exist_ok=True) + gmsh_file = tmp_folder / "2DCell.msh" + gmsh.write(str(gmsh_file)) + gmsh.finalize() + + # return dolfin mesh of max dimension (parent mesh) and marker functions mf2 and mf3 + dmesh, mf2, mf3 = gmsh_to_dolfin(str(gmsh_file), tmp_folder, 2, comm) + # remove tmp mesh and tmp folder + gmsh_file.unlink(missing_ok=False) + tmp_folder.rmdir() + # return dolfin mesh, mf2 (2d tags) and mf3 (3d tags) + if return_curvature: + if innerExpr == "": + facet_list = [outer_marker] + cell_list = [outer_tag] + else: + facet_list = [outer_marker, interface_marker] + cell_list = [outer_tag, inner_tag] + if half_cell_with_curvature: # will likely not work in parallel... + dmesh_half, mf2_half, mf3_half = create_2Dcell( + outerExpr, + innerExpr, + hEdge, + hInnerEdge, + interface_marker, + outer_marker, + inner_tag, + outer_tag, + comm, + verbose, + half_cell=True, + return_curvature=False, + ) + kappa_mf = compute_curvature( + dmesh, mf2, mf3, facet_list, cell_list, half_mesh_data=(dmesh_half, mf2_half) + ) + (dmesh, mf2, mf3) = (dmesh_half, mf2_half, mf3_half) + else: + kappa_mf = compute_curvature(dmesh, mf2, mf3, facet_list, cell_list) + return (dmesh, mf2, mf3, kappa_mf) + else: + return (dmesh, mf2, mf3) + + def gmsh_to_dolfin( gmsh_file_name: str, tmp_folder: pathlib.Path = pathlib.Path("tmp_folder"), @@ -1340,6 +1625,8 @@ def gmsh_to_dolfin( # convert cell mesh cells = mesh_in.get_cells_type(cell_type) cell_data = mesh_in.get_cell_data("gmsh:physical", cell_type) # extract values of tags + if dimension == 2 and np.all(mesh_in.points[:, 2] == 0): + mesh_in.points = mesh_in.points[:, :2] # then prune z values out_mesh_cell = meshio.Mesh( points=mesh_in.points, cells={cell_type: cells}, From 10aef259a3e34919fa37255fa722930fdbeeb634 Mon Sep 17 00:00:00 2001 From: emmetfrancis Date: Mon, 23 Jun 2025 22:30:24 -0700 Subject: [PATCH 02/25] New feature to allow parameters with assigned values over a region of the mesh, introduce new version of example 5 to illustrate SOCE --- examples/example5/example5_withSOCE.ipynb | 837 ++++++++++++++++++++++ examples/example5/model_cur.pkl | Bin 0 -> 3487 bytes smart/model.py | 10 + smart/model_assembly.py | 34 +- 4 files changed, 880 insertions(+), 1 deletion(-) create mode 100644 examples/example5/example5_withSOCE.ipynb create mode 100644 examples/example5/model_cur.pkl diff --git a/examples/example5/example5_withSOCE.ipynb b/examples/example5/example5_withSOCE.ipynb new file mode 100644 index 0000000..d1405bd --- /dev/null +++ b/examples/example5/example5_withSOCE.ipynb @@ -0,0 +1,837 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f65f18d7", + "metadata": {}, + "source": [ + "# Example 5: Generic cell signaling system in 3D, illustrating a SOCE-like effect\n", + "\n", + "This example is slightly altered from the normal version of example 5 to illustrate the role of store-operated calcium entry (SOCE) accompanying calcium release from an interior compartment.\n", + "\n", + "Geometry is divided into 4 domains; two volumes, and two surfaces:\n", + "- cytosol (Cyto): $\\Omega_{Cyto}$\n", + "- endoplasmic reticulum volume (ER): $\\Omega_{ER}$\n", + "- plasma membrane (PM): $\\Gamma_{PM}$\n", + "- ER membrane (ERm): $\\Gamma_{ERm}$\n", + "\n", + "For simplicity, here we consider a \"cube-within-a-cube\" geometry, in which the smaller\n", + "inner cube represents a section of ER and one face of the outer cube ($x=0$) represents the PM. The other\n", + "faces of the outer cube are treated as no flux boundaries. The space outside\n", + "the inner cube but inside the outer cube is classified as cytosol.\n", + "\n", + "There are three function-spaces on these three domains:\n", + "\n", + "$$\n", + "u^{Cyto} = [A, B] \\quad \\text{on} \\quad \\Omega^{Cyto}\\\\\n", + "u^{ER} = [AER] \\quad \\text{on} \\quad \\Omega^{ER}\\\\\n", + "v^{ERm} = [R, Ro] \\quad \\text{on} \\quad \\Gamma^{ERm}\n", + "$$\n", + "\n", + "In words, this says that species A and B reside in the cytosolic volume, \n", + "species AER corresponds to an amount of species A that lives in the ER volume,\n", + "and species R (closed receptor/channel) and Ro (open receptor/channel) reside on the ER membrane.\n", + "\n", + "In this model, species B reacts with a receptor/channel, R, on the ER membrane, causing it to open (change state from R->Ro), \n", + "allowing species A to flow out of the ER and into the cytosol. \n", + "Note that this is roughly similar to an IP3 pulse at the PM, leading to Ca2+ release from the ER,\n", + "where, by analogy, species B is similar to IP3 and species A is similar to Ca2+. A more comprehensive\n", + "model of Ca2+ dynamics in particular is implemented in Example 6.\n", + "\n", + "Here, we also introduce a flux analogous to SOCE, wherein the flux of A through the PM depends on depletion of A from the ER.\n", + "For simplicity, we scale this flux with the distance between the PM and ER ($d_{PM-ER}$) and the concentration of A at closest point of ER to the PM ($A_{ER,close}$):\n", + "\n", + "$$\n", + "J_{SOCE} = \\frac{d_0}{d_{PM-ER} + d_0} \\frac{1}{1 + \\left(\\frac{A_{ER}}{A_{ref}}\\right)^4},\n", + "$$\n", + "\n", + "where $d_0$ is a characteristic length scale controlling the likelihood of STIM-Orai binding and $A_{ref}$ governs the ER calcium depletion required to trigger SOCE." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5edff5d", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import matplotlib.image as mpimg\n", + "img_A = mpimg.imread('example5-diagram.png')\n", + "plt.imshow(img_A)\n", + "plt.axis('off')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "f543d75e", + "metadata": {}, + "source": [ + "As specified in our [mathematical documentation](https://rangamanilabucsd.github.io/smart/docs/math.html), assuming diffusive transport, the PDE and boundary condition for each of these volumetric species takes the form:\n", + "\n", + "$$\n", + "\\partial_t u_i^m - \\nabla \\cdot ( D_i^m \\nabla (u_i^m) ) - f_i^m(u_i^m) = 0 \\qquad \\text{ in } \\Omega^m\\\\\n", + "D_i \\nabla u_i^m \\cdot n^m - R_i^{q} (u^m, u^n, v^q) = 0 \\qquad \\text{ on } \\Gamma^{q}\n", + "$$\n", + "\n", + "and the surface species take the form:\n", + "\n", + "$$\n", + "\\partial_t v_i^q - \\nabla_S \\cdot (D_i^q \\nabla_S v ) - g_i^q ( u^m, u^n, v^q ) = 0 \\qquad \\text{ on } \\Gamma^{q}\\\\\n", + "D_i \\nabla v_i^q \\cdot n^q = 0 \\qquad \\text{ on } \\partial\\Gamma^{q}\n", + "$$\n", + "\n", + "Our reaction terms and boundary conditions are chosen according to the system described above. For the purposes of this simplified example we use linear mass action in all reaction terms except SOCE. Explicitly writing out this system of PDEs, we have:\n", + "\n", + "\\begin{align}\n", + " \\partial_t u_B^{Cyto} - D_B^{Cyto} \\nabla^2 u_B^{Cyto} + k_{2f} u_B^{Cyto} &= 0 \\qquad \\text{ in } \\Omega^{Cyto}\\\\\n", + " D_B^{Cyto} \\nabla u_B^{Cyto} \\cdot n^{Cyto} + j_1[t] &= 0 \\qquad \\text{ on } \\Gamma^{PM} \\nonumber\\\\\n", + " D_B^{Cyto} \\nabla u_B^{Cyto} \\cdot n^{Cyto} + k_{3f} v_R^{ERm} u_B^{Cyto} - k_{3r} v_{Ro}^{ERm} &= 0 \\qquad \\text{ on } \\Gamma^{ERm} \\nonumber\\\\\n", + " \\nonumber \\\\\n", + " \\partial_t u_A^{Cyto} - D_A^{Cyto} \\nabla^2 u_A^{Cyto} &= 0 \\qquad \\text{ in } \\Omega^{Cyto}\\\\\n", + " D_A^{Cyto} \\nabla u_A^{Cyto} \\cdot n^{Cyto} - J_{SOCE} &= 0 \\qquad \\text{ on } \\Gamma^{PM} \\nonumber\\\\\n", + " D_A^{Cyto} \\nabla u_A^{Cyto} \\cdot n^{Cyto} - k_{4,Vmax} v_{Ro}^{ERm} (u_{AER}^{ER} - u_A^{Cyto}) &= 0 \\qquad \\text{ on } \\Gamma^{ERm} \\nonumber\\\\\n", + " \\nonumber \\\\\n", + " \\partial_t u_{AER}^{ER} - D_{AER}^{ER} \\nabla^2 u_{AER}^{ER} &= 0 \\qquad \\text{ in } \\Omega^{ER}\\\\\n", + " D_{AER}^{ER} \\nabla u_{AER}^{ER} \\cdot n^{ER} + k_{4,Vmax} v_{Ro}^{ERm} (u_{AER}^{ER} - u_A^{Cyto}) &= 0 \\qquad \\text{ on } \\Gamma^{ERm} \\nonumber\\\\\n", + " \\nonumber \\\\\n", + " \\partial_t v_{R}^{ERm} - D_{R}^{ERm} \\nabla^2 v_{R}^{ERm} - \n", + " k_{3f} v_R^{ERm} u_B^{Cyto} + k_{3r} v_{Ro}^{ERm} &= 0 \\qquad \\text{ on } \\Gamma^{ERm}\\\\\n", + " \\nonumber \\\\\n", + " \\partial_t v_{Ro}^{ERm} - D_{Ro}^{ERm} \\nabla^2 v_{Ro}^{ERm} +\n", + " k_{3f} v_R^{ERm} u_B^{Cyto} - k_{3r} v_{Ro}^{ERm} &= 0 \\qquad \\text{ on } \\Gamma^{ERm}\\\\\n", + "\\end{align}" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "28f77cbf", + "metadata": {}, + "source": [ + "## Code imports and initialization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc398816", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "import dolfin as d\n", + "import sympy as sym\n", + "import numpy as np\n", + "import pathlib\n", + "import gmsh # must be imported before pyvista if dolfin is imported first\n", + "\n", + "from smart import config, mesh, model, mesh_tools, visualization\n", + "from smart.model_assembly import (\n", + " Compartment,\n", + " Parameter,\n", + " Reaction,\n", + " Species,\n", + " SpeciesContainer,\n", + " ParameterContainer,\n", + " CompartmentContainer,\n", + " ReactionContainer,\n", + ")\n", + "from smart.units import unit" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "c8650536", + "metadata": {}, + "source": [ + "We will set the logging level to `INFO`. This will display some output during the simulation. If you want to get even more output you could set the logging level to `DEBUG`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ed0899a", + "metadata": {}, + "outputs": [], + "source": [ + "logger = logging.getLogger(\"smart\")\n", + "logger.setLevel(logging.INFO)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "defc1095", + "metadata": {}, + "source": [ + "Futhermore, you could also save the logs to a file by attaching a file handler to the logger as follows.\n", + "\n", + "```\n", + "file_handler = logging.FileHandler(\"filename.log\")\n", + "file_handler.setFormatter(logging.Formatter(smart.config.base_format))\n", + "logger.addHandler(file_handler)\n", + "```" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "95b9d865", + "metadata": {}, + "source": [ + "First, we define the various units for the inputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f4023cf", + "metadata": {}, + "outputs": [], + "source": [ + "# Aliases - base units\n", + "uM = unit.uM\n", + "um = unit.um\n", + "molecule = unit.molecule\n", + "sec = unit.sec\n", + "# Aliases - units used in model\n", + "D_unit = um**2 / sec\n", + "flux_unit = molecule / (um**2 * sec)\n", + "vol_unit = uM\n", + "surf_unit = molecule / um**2" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "46582d26", + "metadata": {}, + "source": [ + "## Generate model\n", + "Next we generate the model described in the equations above.\n", + "\n", + "### Compartments\n", + "As described above, the three compartments are the cytosol (\"Cyto\"), the plasma membrane (\"PM\"), the ER membrane (\"ERm\"), and the ER interior volume (\"ER\").\n", + "\n", + "Note that, as shown, we can also specify nonadjacency for compartments; this is not strictly necessary, but will generally speed up the simulations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2f34b3c", + "metadata": {}, + "outputs": [], + "source": [ + "Cyto = Compartment(\"Cyto\", 3, um, 1)\n", + "PM = Compartment(\"PM\", 2, um, 10)\n", + "ER = Compartment(\"ER\", 3, um, 2)\n", + "ERm = Compartment(\"ERm\", 2, um, 12)\n", + "PM.specify_nonadjacency(['ERm', 'ER'])\n", + "ERm.specify_nonadjacency(['PM'])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "d93ce862", + "metadata": {}, + "source": [ + "Initialize a compartment container and add the 4 compartments to it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "701577e8", + "metadata": {}, + "outputs": [], + "source": [ + "cc = CompartmentContainer()\n", + "cc.add([ERm, ER, PM, Cyto])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "0a6acf0b", + "metadata": {}, + "source": [ + "### Species\n", + "In this case, we have 5 species across 3 different compartments. We define each in turn:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d991278", + "metadata": {}, + "outputs": [], + "source": [ + "A = Species(\"A\", 0.01, vol_unit, 1.0, D_unit, \"Cyto\")\n", + "B = Species(\"B\", 0.0, vol_unit, 1.0, D_unit, \"Cyto\")\n", + "AER = Species(\"AER\", 200.0, vol_unit, 5.0, D_unit, \"ER\")\n", + "# Uniform initial condition of R\n", + "R1 = Species(\"R1\", 1.0, surf_unit, 0.02, D_unit, \"ERm\")\n", + "R1o = Species(\"R1o\", 0.0, surf_unit, 0.02, D_unit, \"ERm\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "b60826cc", + "metadata": {}, + "source": [ + "Create species container and add the 5 species objects to it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e86bebaf", + "metadata": {}, + "outputs": [], + "source": [ + "sc = SpeciesContainer()\n", + "sc.add([R1o, R1, AER, B, A])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "af900a73", + "metadata": {}, + "source": [ + "### Parameters and Reactions\n", + "\n", + "Parameters and reactions are generally defined together, although the order does not strictly matter. We define them in turn as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2120ac6", + "metadata": {}, + "outputs": [], + "source": [ + "# Degradation of B in the cytosol\n", + "k2f = Parameter(\"k2f\", 10, 1 / sec)\n", + "r2 = Reaction(\n", + " \"r2\", [\"B\"], [], param_map={\"on\": \"k2f\"}, reaction_type=\"mass_action_forward\"\n", + ")\n", + "\n", + "# Activating receptors on ERm with B\n", + "k3f = Parameter(\"k3f\", 100, 1 / (uM * sec))\n", + "k3r = Parameter(\"k3r\", 100, 1 / sec)\n", + "r3 = Reaction(\"r3\", [\"B\", \"R1\"], [\"R1o\"], {\"on\": \"k3f\", \"off\": \"k3r\"})\n", + "# Release of A from ERm to cytosol\n", + "k4Vmax = Parameter(\"k4Vmax\", 2000, 1 / (uM * sec))\n", + "r4 = Reaction(\n", + " \"r4\",\n", + " [\"AER\"],\n", + " [\"A\"],\n", + " param_map={\"Vmax\": \"k4Vmax\"},\n", + " species_map={\"R1o\": \"R1o\", \"uER\": \"AER\", \"u\": \"A\"},\n", + " eqn_f_str=\"Vmax*R1o*(uER-u)\",\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "7fdd58b8", + "metadata": {}, + "source": [ + "We define an additional reaction as the time-dependent production of species B at the plasma membrane. In this case, we define a pulse-type function as the derivative of an arctan function. Note that this is useful because we can provide an expression to use for pre-integration.\n", + "\n", + "$$\n", + "j_{int}[t] = V_{max} \\arctan\\left({m (t - t_0)}\\right)\\\\\n", + "j_1[t] = \\frac{dj_{int}[t]}{dt} = \\frac{m V_{max}}{1 + m^2 (t-t_0)^2}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51abf270", + "metadata": {}, + "outputs": [], + "source": [ + "Vmax, t0, m = 500, 0.1, 200\n", + "t = sym.symbols(\"t\")\n", + "pulseI = Vmax * sym.atan(m * (t - t0))\n", + "pulse = sym.diff(pulseI, t)\n", + "j1pulse = Parameter.from_expression(\n", + " \"j1pulse\", pulse, flux_unit, use_preintegration=True, preint_sym_expr=pulseI\n", + ")\n", + "r1 = Reaction(\n", + " \"r1\",\n", + " [],\n", + " [\"B\"],\n", + " param_map={\"J\": \"j1pulse\"},\n", + " eqn_f_str=\"J\",\n", + " explicit_restriction_to_domain=\"PM\",\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "b5e218b0", + "metadata": {}, + "source": [ + "We can plot the time-dependent input by converting the sympy expression to a numpy function using lambdify." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0829a6b", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy.utilities.lambdify import lambdify\n", + "pulse_func = lambdify(t, pulse, 'numpy') # returns a numpy-ready function\n", + "tArray = np.linspace(0, 1, 100)\n", + "pulse_vals = pulse_func(tArray)\n", + "plt.plot(tArray, pulse_vals)" + ] + }, + { + "cell_type": "markdown", + "id": "55c27105", + "metadata": {}, + "source": [ + "Finally, we define the store-operated calcium (or here, A) influx. \n", + "This is not immediately straightforward, as a flux at the PM depends on concentration of A in the ER.\n", + "One option would be to explicitly introduce contacts between the ER and PM, but this would imply direct entry of calcium into the ER through Orai1.\n", + "Instead, we assume the likelihood of STIM-Orai1 binding scales with PM-ER distance (if they are very close, membrane fluctuations are likely to allow contact between the ERM and PM occasionally, for instance).\n", + "To adopt this strategy, we must construct a map between each point on the PM and the closest point on the ER, which we do after initializing the model below.\n", + "For now, we define the flux as a parameter varying over the PM mesh by calling `Parameter.mesh_quantity()`\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a56bbccb", + "metadata": {}, + "outputs": [], + "source": [ + "PSOCE = Parameter.mesh_quantity(\"PSOCE\", 0, unit.dimensionless, compartment=\"PM\")\n", + "J0_SOCE = Parameter(\"J0_SOCE\", 1e4, flux_unit)\n", + "rSOCE = Reaction(\n", + " \"rSOCE\",\n", + " [],\n", + " [\"A\"],\n", + " param_map={\"P\": \"PSOCE\", \"J0\": \"J0_SOCE\"},\n", + " eqn_f_str=\"P*J0\",\n", + " explicit_restriction_to_domain=\"PM\",\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3d883c6e", + "metadata": {}, + "source": [ + "Create containers for parameters and reactions and add all the parameters and reaction objects to them." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ae2c2c1", + "metadata": {}, + "outputs": [], + "source": [ + "pc = ParameterContainer()\n", + "rc = ReactionContainer()\n", + "pc.add([k4Vmax, k3r, k3f, k2f, j1pulse, PSOCE, J0_SOCE])\n", + "rc.add([r1, r2, r3, r4, rSOCE])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "15c35d39", + "metadata": {}, + "source": [ + "## Create/load in mesh\n", + "\n", + "In SMART we have different levels of meshes:\n", + "- Parent mesh: contains the entire geometry of the problem, including all surfaces and volumes\n", + "- Child meshes: submeshes (sections of the parent mesh) associated with individual compartments. Here, the child meshes are:\n", + " - Cyto: the portion of the outer cube outside of the inner cube, defined by `cell_markers = 1`\n", + " - ER: the inside portion of the inner cube, defined by `cell_markers = 2`\n", + " - PM: surface mesh where x=0, defined by `facet_markers = 10`\n", + " - ERm: surface mesh corresponding to all faces of the inner cube, defined by `facet_markers = 12`\n", + "\n", + "Here we create a UnitCube mesh as the Parent mesh, defined by\n", + "\n", + "$$\n", + "\\Omega = [0, 1] \\times [0, 1] \\times [0, 1] \\subset \\mathbb{R}^3\n", + "$$\n", + "\n", + "\n", + "The ER is a cube within the exterior cube, with dimensions 0.4 by 0.4 by 0.4 and a tunable gap between the ER and PM to test for different strengths of SOCE below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e77f97fe", + "metadata": {}, + "outputs": [], + "source": [ + "ER_PM_gap = 0 # must be greater than 0 and less than 0.6\n", + "ER_PM_gap = 0.05 * round(ER_PM_gap/0.05) # round to ensure flat edges in mesh\n", + "def cur_cube_condition(cell, xmin=ER_PM_gap, xmax=ER_PM_gap+0.4):\n", + " \"\"\"\n", + " Returns true when inside an inner cube region defined as:\n", + " xmin <= x <= xmax, ymin <= y <= ymax, zmin <= z <= zmax\n", + " \"\"\"\n", + " ymin = 0.3\n", + " ymax = 0.7\n", + " zmin = 0.3\n", + " zmax = 0.7\n", + " return (\n", + " (xmin - d.DOLFIN_EPS < cell.midpoint().x() < xmax + d.DOLFIN_EPS)\n", + " and (ymin - d.DOLFIN_EPS < cell.midpoint().y() < ymax + d.DOLFIN_EPS)\n", + " and (zmin - d.DOLFIN_EPS < cell.midpoint().z() < zmax + d.DOLFIN_EPS)\n", + " )\n", + "domain, facet_markers, cell_markers = mesh_tools.create_cubes(condition=cur_cube_condition, N=20)\n", + "visualization.plot_dolfin_mesh(domain, cell_markers, clip_plane=(1,\n", + " 1, 0), clip_origin=(0.5, 0.5, 0.5))\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "035113ed", + "metadata": {}, + "source": [ + "By default, `smart.mesh_tools.create_cubes` marks all faces of the outer cube as \"10\", our marker value associated with PM. Here, since we are only treating the x=0 face as PM, we alter the facet markers on all other faces, setting them equal to zero. They are then treated as no-flux boundaries not belonging to a designated surface compartment. The resultant mesh with the new facet and volume markers is displayed below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe56e162", + "metadata": {}, + "outputs": [], + "source": [ + "for face in d.faces(domain):\n", + " if face.midpoint().x() > d.DOLFIN_EPS and facet_markers[face] == 10:\n", + " facet_markers[face] = 0\n", + "img_mesh = mpimg.imread('example5-mesh.png')\n", + "plt.imshow(img_mesh)\n", + "plt.axis('off')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "c17ebcbb", + "metadata": {}, + "source": [ + "We now save the mesh as an h5 file and then read it into SMART as a `ParentMesh` object. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5657aab1", + "metadata": {}, + "outputs": [], + "source": [ + "mesh_folder = pathlib.Path(\"mesh\")\n", + "mesh_folder.mkdir(exist_ok=True)\n", + "mesh_path = mesh_folder / \"DemoCuboidsMesh.h5\"\n", + "mesh_tools.write_mesh(\n", + " domain, facet_markers, cell_markers, filename=mesh_path\n", + ")\n", + "parent_mesh = mesh.ParentMesh(\n", + " mesh_filename=str(mesh_path),\n", + " mesh_filetype=\"hdf5\",\n", + " name=\"parent_mesh\",\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "0f1cf8a4", + "metadata": {}, + "source": [ + "## Model and solver initialization\n", + "\n", + "Now we are ready to set up the model. First we load the default configurations and set some configurations for the current solver." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c1a2a92", + "metadata": {}, + "outputs": [], + "source": [ + "conf = config.Config()\n", + "conf.solver.update(\n", + " {\n", + " \"final_t\": 1,\n", + " \"initial_dt\": 0.01,\n", + " \"time_precision\": 6,\n", + " }\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "1511acc7", + "metadata": {}, + "source": [ + "We create a model using the different containers and the parent mesh. For later reference, we save the model information as a pickle file. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3c3c30f", + "metadata": {}, + "outputs": [], + "source": [ + "model_cur = model.Model(pc, sc, cc, rc, conf, parent_mesh)\n", + "model_cur.to_pickle('model_cur.pkl')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "dfb70c74", + "metadata": {}, + "source": [ + "Note that we could later load the model information from the pickle file using the line:\n", + "```Python\n", + "model_cur = model.from_pickle(model_cur.pkl)\n", + "```\n", + "\n", + "Next we need to initialize the model and solver." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8976aa2", + "metadata": {}, + "outputs": [], + "source": [ + "model_cur.initialize()" + ] + }, + { + "cell_type": "markdown", + "id": "70f79003", + "metadata": {}, + "source": [ + "Now create mapping between PM and closest point on the ER surface for spatially dependent SOCE." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db8d9dca", + "metadata": {}, + "outputs": [], + "source": [ + "Pfun = PSOCE.dolfin_function # function associated with PSOCE values\n", + "V_PM = Pfun.function_space() # PM function space\n", + "# pull coordinate lists for PM and ERM\n", + "PMcoord = V_PM.tabulate_dof_coordinates()\n", + "ERMcoord = ERm.dolfin_mesh.coordinates()\n", + "# initialize vectors for distances and AER indices\n", + "AER_idx = np.zeros_like(Pfun.vector())\n", + "dist_vals = np.zeros_like(Pfun.vector())\n", + "# get parent mesh and vertex mapping to meshviews\n", + "mesh_ref = model_cur.parent_mesh.dolfin_mesh\n", + "ERM_map = ERm.dolfin_mesh.topology().mapping()[mesh_ref.id()].vertex_map()\n", + "ER_map = ER.dolfin_mesh.topology().mapping()[mesh_ref.id()].vertex_map()\n", + "# find closest ERM point for each PM coordinate\n", + "for i in range(len(PMcoord)):\n", + " curCoord = PMcoord[i]\n", + " dists = np.sqrt((curCoord[0]-ERMcoord[:,0])**2 + \n", + " (curCoord[1]-ERMcoord[:,1])**2 + \n", + " (curCoord[2]-ERMcoord[:,2])**2)\n", + " ERMidx = np.argmin(dists)\n", + " dist_vals[i] = dists[ERMidx]\n", + " global_idx = ERM_map[ERMidx]\n", + " ER_idx = np.nonzero(np.array(ER_map)==global_idx)[0]\n", + " if len(ER_idx) != 1:\n", + " raise ValueError(\"Node not found in ER mesh\")\n", + " AER_idx[i] = d.vertex_to_dof_map(AER.V)[ER_idx][0]\n", + "# now define PSOCE function values according to dist vals and AER values\n", + "d0 = 0.01\n", + "cref = 2.0\n", + "vals_new = (d0/(dist_vals+d0)) * (1/(1+(AER.u[\"u\"].vector()[AER_idx]/cref)**4))\n", + "PSOCE.dolfin_function.vector()[:] = vals_new\n", + "PSOCE.dolfin_function.vector().apply(\"insert\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "d05a1a75", + "metadata": {}, + "source": [ + "## Solving system and storing data\n", + "\n", + "We create some XDMF files where we will store the output " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5df9509e", + "metadata": {}, + "outputs": [], + "source": [ + "# Write initial condition(s) to file\n", + "results = dict()\n", + "result_folder = pathlib.Path(f\"results_ER_PM_gap_{ER_PM_gap}\")\n", + "result_folder.mkdir(exist_ok=True)\n", + "for species_name, species in model_cur.sc.items:\n", + " results[species_name] = d.XDMFFile(\n", + " model_cur.mpi_comm_world, str(result_folder / f\"{species_name}.xdmf\")\n", + " )\n", + " results[species_name].parameters[\"flush_output\"] = True\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + "SOCEfile = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"PSOCE.xdmf\"))\n", + "SOCEfile.parameters[\"flush_output\"] = True\n", + "SOCEfile.write(PSOCE.dolfin_function, model_cur.t)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "183376e6", + "metadata": {}, + "source": [ + "We now run the the solver and store the data at each time point to the initialized files. We also integrate A over the cytosolic volume at each time step to monitor the elevation in A over time and we display the concentration of A in the cytosol at t = 0.2 s." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31d42278", + "metadata": {}, + "outputs": [], + "source": [ + "# Set loglevel to warning in order not to pollute notebook output\n", + "logger.setLevel(logging.WARNING)\n", + "\n", + "avg_A = [A.initial_condition]\n", + "# define integration measure and total volume for computing average A at each time point\n", + "dx = d.Measure(\"dx\", domain=model_cur.cc['Cyto'].dolfin_mesh)\n", + "volume = d.assemble_mixed(1.0*dx)\n", + "# Solve\n", + "displayed = False\n", + "while model_cur.t < model_cur.final_t:\n", + " # Solve the system\n", + " model_cur.monolithic_solve()\n", + " # Update PSOCE\n", + " PSOCE.dolfin_function.vector()[:] = (d0/(dist_vals+d0)) * (1/(1+(AER.u[\"u\"].vector()[AER_idx]/cref)**4))\n", + " PSOCE.dolfin_function.vector().apply(\"insert\")\n", + " # Save results for post processing\n", + " for species_name, species in model_cur.sc.items:\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + " SOCEfile.write(PSOCE.dolfin_function, model_cur.t)\n", + " # compute average A concentration at each time step\n", + " int_val = d.assemble_mixed(model_cur.sc['A'].u['u']*dx)\n", + " avg_A.append(int_val / volume)\n", + " if model_cur.t >= 0.2 and not displayed:\n", + " visualization.plot(model_cur.sc['A'].u['u'],\n", + " clip_plane=(1, 1, 0), clip_origin=(0.5, 0.5, 0.5))\n", + " displayed = True" + ] + }, + { + "cell_type": "markdown", + "id": "621600d7", + "metadata": {}, + "source": [ + "Finally, we plot the average concentration of A over time." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8651e71", + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(model_cur.tvec, avg_A)\n", + "plt.xlabel('Time (s)')\n", + "plt.ylabel('Cytosolic concentration of A (μM)')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "d302bf3f", + "metadata": {}, + "source": [ + "We also compare the AUC for A with previous numerical simulations (regression test)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8b3c866", + "metadata": {}, + "outputs": [], + "source": [ + "tvec = np.zeros(len(model_cur.tvec))\n", + "for i in range(len(model_cur.tvec)):\n", + " tvec[i] = float(model_cur.tvec[i])\n", + "auc_cur = np.trapz(np.array(avg_A), tvec)\n", + "auc_compare = 4.646230684534995\n", + "percent_error = 100*np.abs(auc_cur - auc_compare)/auc_compare\n", + "assert percent_error < .01,\\\n", + " f\"Failed regression test: Example 5 results deviate {percent_error:.3f}% from the previous numerical solution\"" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/example5/model_cur.pkl b/examples/example5/model_cur.pkl new file mode 100644 index 0000000000000000000000000000000000000000..7830aa97204403756203f5688e83bd692ce48e07 GIT binary patch literal 3487 zcmcInO^h5z72cki{qg?U-mGGggCXFA$%+iNV~ZQvu(22K$m3k{@iFSBy< z{X$A+yq(3`^eX4m=H62fYa=R8kK+Ha zL-pvP`uL&x1SV&C>am`Byr({?o>ZL?2L1apXsd@Uhnf+b^gl8>?--r=KWQ?(doHhH zEv+`$r{;h0`X7FJx4GIhgZPs{6-$F~t0R(;WH#PMMBZ1+1NG>EH76~?QTcu+$O_p> zDgdB)6(hX5G_sLa$u=XDrmt{xT3Bqn{)#v8vU$nSi4n>?yNO+DZe}<6lF{2m7-HiY zjISBBNzH31M-Myxn%cU$`dz+DeMLQoy~)cpVA{}ZAsG1qV84cP-3uISFB(9%kU^vw zEZvLxTZT@K2!mI|prNVj?gavQ^|`qqOOmPt%x*|?fP=3v_pNS&rQr9$AJWYA=V`YEOvvz1Z*8M6C7`?h9W0?T4qS)`0MYNNp88TfF1xR2(V9IuQP6^i0yJ)(N zZqo^;`c@Uby8A0@m2ALpAl(oED>TcHm)e?u@uxb^8?`5D*iCL;zqWRXBgqBp#Khf^ zbRQfXj00|k780q|?R@K44nR1)an>I&T>bfhOl<~t_xF1=Qyg6jAeq3+- z#BTgdy~XybPp?K}r*Eguhr8Y#dGpQn)#aLa>_%!_a!#l(byNt8fkkCCenD$( zzs&B?>YL7X4}67s$7&^Me#B%0Pb*KoMT;S7Udmn&F<13&gHDdneu!(-l{?KqbAgOw zA7yM0NvS(;Rrb^`)o;2@_1oIgzq9)OzU!>)QDgI}0YT#~g4z1`JNG>9Rg#VsQaI?F zVK37t&LQi?iq)fL;hx^-j6mw*LJH|}PGsJOQI|B$)nQ*Rt0Q%!QBmXSmahZYBHaP8 zI_ha!7%=l)xtYpg<|2kCv#^XQuzmGqc{ts?5dCD?rt0QV` zoimbIQFH5DW(0F=?@oG%;m=Sr>!UcIt(Y~4)zR)eHr%ktZ#+~i4|aQYy=T{Y6@;4` z5$-{Rx?qJuQ3Ix|_T)X|1frJhVAYg0Lff*i12roU@1BAfK{W((Fta-0t>9PapRNK6XxEgn=D*HW*5O|_AX~L@-~h74mCE;8ufi^F((bP zw=Q#hbmh1wuJC~|H%WApqTtMD%R@hkrAvXQc>d{UWsZVa$7XRUA0b8 zM-J#TKe@%On_1}tPf{S%_jM@|(KI_KGGU35P^UFICc<4{%g17m7Hu~^(sfMH`0U++ Date: Mon, 23 Jun 2025 22:31:09 -0700 Subject: [PATCH 03/25] Remove model specs file for example 5 --- examples/example5/model_cur.pkl | Bin 3487 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/example5/model_cur.pkl diff --git a/examples/example5/model_cur.pkl b/examples/example5/model_cur.pkl deleted file mode 100644 index 7830aa97204403756203f5688e83bd692ce48e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3487 zcmcInO^h5z72cki{qg?U-mGGggCXFA$%+iNV~ZQvu(22K$m3k{@iFSBy< z{X$A+yq(3`^eX4m=H62fYa=R8kK+Ha zL-pvP`uL&x1SV&C>am`Byr({?o>ZL?2L1apXsd@Uhnf+b^gl8>?--r=KWQ?(doHhH zEv+`$r{;h0`X7FJx4GIhgZPs{6-$F~t0R(;WH#PMMBZ1+1NG>EH76~?QTcu+$O_p> zDgdB)6(hX5G_sLa$u=XDrmt{xT3Bqn{)#v8vU$nSi4n>?yNO+DZe}<6lF{2m7-HiY zjISBBNzH31M-Myxn%cU$`dz+DeMLQoy~)cpVA{}ZAsG1qV84cP-3uISFB(9%kU^vw zEZvLxTZT@K2!mI|prNVj?gavQ^|`qqOOmPt%x*|?fP=3v_pNS&rQr9$AJWYA=V`YEOvvz1Z*8M6C7`?h9W0?T4qS)`0MYNNp88TfF1xR2(V9IuQP6^i0yJ)(N zZqo^;`c@Uby8A0@m2ALpAl(oED>TcHm)e?u@uxb^8?`5D*iCL;zqWRXBgqBp#Khf^ zbRQfXj00|k780q|?R@K44nR1)an>I&T>bfhOl<~t_xF1=Qyg6jAeq3+- z#BTgdy~XybPp?K}r*Eguhr8Y#dGpQn)#aLa>_%!_a!#l(byNt8fkkCCenD$( zzs&B?>YL7X4}67s$7&^Me#B%0Pb*KoMT;S7Udmn&F<13&gHDdneu!(-l{?KqbAgOw zA7yM0NvS(;Rrb^`)o;2@_1oIgzq9)OzU!>)QDgI}0YT#~g4z1`JNG>9Rg#VsQaI?F zVK37t&LQi?iq)fL;hx^-j6mw*LJH|}PGsJOQI|B$)nQ*Rt0Q%!QBmXSmahZYBHaP8 zI_ha!7%=l)xtYpg<|2kCv#^XQuzmGqc{ts?5dCD?rt0QV` zoimbIQFH5DW(0F=?@oG%;m=Sr>!UcIt(Y~4)zR)eHr%ktZ#+~i4|aQYy=T{Y6@;4` z5$-{Rx?qJuQ3Ix|_T)X|1frJhVAYg0Lff*i12roU@1BAfK{W((Fta-0t>9PapRNK6XxEgn=D*HW*5O|_AX~L@-~h74mCE;8ufi^F((bP zw=Q#hbmh1wuJC~|H%WApqTtMD%R@hkrAvXQc>d{UWsZVa$7XRUA0b8 zM-J#TKe@%On_1}tPf{S%_jM@|(KI_KGGU35P^UFICc<4{%g17m7Hu~^(sfMH`0U++ Date: Mon, 23 Jun 2025 22:42:12 -0700 Subject: [PATCH 04/25] Change version number in pyproject --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0bbb4e3..7a80519 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.0.0", "wheel"] [project] name = "fenics-smart" -version = "2.2.3" +version = "2.3.0" description = "Spatial Modeling Algorithms for Reactions and Transport (SMART) is a high-performance finite-element-based simulation package for model specification and numerical simulation of spatially-varying reaction-transport processes in biological cells." authors = [{ name = "Justin Laughlin", email = "justinglaughlin@gmail.com" }] license = { file = "LICENSE" } From a25eabc6c17e1bdb5baf40bd802472e5d4f9ea70 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Tue, 24 Jun 2025 17:42:30 -0700 Subject: [PATCH 05/25] Update ER_PM_gap value and save Avals in example5 with SOCE --- examples/example5/example5_withSOCE.ipynb | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/examples/example5/example5_withSOCE.ipynb b/examples/example5/example5_withSOCE.ipynb index d1405bd..c70075b 100644 --- a/examples/example5/example5_withSOCE.ipynb +++ b/examples/example5/example5_withSOCE.ipynb @@ -276,7 +276,7 @@ "A = Species(\"A\", 0.01, vol_unit, 1.0, D_unit, \"Cyto\")\n", "B = Species(\"B\", 0.0, vol_unit, 1.0, D_unit, \"Cyto\")\n", "AER = Species(\"AER\", 200.0, vol_unit, 5.0, D_unit, \"ER\")\n", - "# Uniform initial condition of R\n", + "# Uniform initial condition of R for simplicity\n", "R1 = Species(\"R1\", 1.0, surf_unit, 0.02, D_unit, \"ERm\")\n", "R1o = Species(\"R1o\", 0.0, surf_unit, 0.02, D_unit, \"ERm\")" ] @@ -490,7 +490,7 @@ "metadata": {}, "outputs": [], "source": [ - "ER_PM_gap = 0 # must be greater than 0 and less than 0.6\n", + "ER_PM_gap = 0.05 # must be greater than 0 and less than 0.6\n", "ER_PM_gap = 0.05 * round(ER_PM_gap/0.05) # round to ensure flat edges in mesh\n", "def cur_cube_condition(cell, xmin=ER_PM_gap, xmax=ER_PM_gap+0.4):\n", " \"\"\"\n", @@ -517,7 +517,7 @@ "id": "035113ed", "metadata": {}, "source": [ - "By default, `smart.mesh_tools.create_cubes` marks all faces of the outer cube as \"10\", our marker value associated with PM. Here, since we are only treating the x=0 face as PM, we alter the facet markers on all other faces, setting them equal to zero. They are then treated as no-flux boundaries not belonging to a designated surface compartment. The resultant mesh with the new facet and volume markers is displayed below." + "By default, `smart.mesh_tools.create_cubes` marks all faces of the outer cube as \"10\", our marker value associated with PM. Here, since we are only treating the x=0 face as PM, we alter the facet markers on all other faces, setting them equal to zero. They are then treated as no-flux boundaries not belonging to a designated surface compartment." ] }, { @@ -529,10 +529,7 @@ "source": [ "for face in d.faces(domain):\n", " if face.midpoint().x() > d.DOLFIN_EPS and facet_markers[face] == 10:\n", - " facet_markers[face] = 0\n", - "img_mesh = mpimg.imread('example5-mesh.png')\n", - "plt.imshow(img_mesh)\n", - "plt.axis('off')" + " facet_markers[face] = 0" ] }, { @@ -677,8 +674,8 @@ " raise ValueError(\"Node not found in ER mesh\")\n", " AER_idx[i] = d.vertex_to_dof_map(AER.V)[ER_idx][0]\n", "# now define PSOCE function values according to dist vals and AER values\n", - "d0 = 0.01\n", - "cref = 2.0\n", + "d0 = 0.05\n", + "cref = 100.0\n", "vals_new = (d0/(dist_vals+d0)) * (1/(1+(AER.u[\"u\"].vector()[AER_idx]/cref)**4))\n", "PSOCE.dolfin_function.vector()[:] = vals_new\n", "PSOCE.dolfin_function.vector().apply(\"insert\")" @@ -776,9 +773,13 @@ "metadata": {}, "outputs": [], "source": [ - "plt.plot(model_cur.tvec, avg_A)\n", + "plt.plot(model_cur.tvec, avg_A, label='PM-ER gap = 50 nm')\n", + "other_case = np.loadtxt('/root/shared/gitrepos/smart-dev/examples/example5/results_ER_PM_gap_0.2/Avals.txt')\n", + "plt.plot(other_case[0,:], other_case[1,:], label='PM-ER gap = 200 nm')\n", "plt.xlabel('Time (s)')\n", - "plt.ylabel('Cytosolic concentration of A (μM)')" + "plt.ylabel('Cytosolic concentration of A (μM)')\n", + "plt.legend()\n", + "np.savetxt(str(result_folder / f\"Avals.txt\"), [model_cur.tvec, avg_A])" ] }, { From be9bb82255bbe262cf3adb4a70de8eee9fa0ef35 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Fri, 11 Jul 2025 14:08:12 -0700 Subject: [PATCH 06/25] Add and test code for advective transport --- .../example2/example2_withadvection.ipynb | 544 ++++++++++++++++++ smart/model.py | 96 +++- smart/model_assembly.py | 4 + 3 files changed, 635 insertions(+), 9 deletions(-) create mode 100644 examples/example2/example2_withadvection.ipynb diff --git a/examples/example2/example2_withadvection.ipynb b/examples/example2/example2_withadvection.ipynb new file mode 100644 index 0000000..f0f47d9 --- /dev/null +++ b/examples/example2/example2_withadvection.ipynb @@ -0,0 +1,544 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f65f18d7", + "metadata": {}, + "source": [ + "# Example 2: Simple 2D cell signaling model\n", + "\n", + "We model a reaction between the cell interior and cell membrane in a 2D geometry:\n", + "- Cyto - 2D cell \"volume\"\n", + "- PM - 1D cell boundary (represents plasma membrane)\n", + "\n", + "Model from [Rangamani et al, 2013, Cell](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3874130/). A cytosolic species, \"A\", reacts with a species on the PM, \"B\", to form a new species on the PM, \"X\". The resulting PDE and boundary condition for species A are as follows:\n", + "\n", + "$$\n", + "\\frac{\\partial{C_A}}{\\partial{t}} = D_A \\nabla ^2 C_A \\quad \\text{in} \\; \\Omega_{Cyto}\\\\\n", + "\\text{B.C. for A:} \\quad D_A (\\textbf{n} \\cdot \\nabla C_A) = -k_{on} C_A N_X + k_{off} N_B \\quad \\text{on} \\; \\Gamma_{PM}\n", + "$$\n", + "\n", + "Similarly, the PDEs for X and B are given by:\n", + "$$\n", + "\\frac{\\partial{N_X}}{\\partial{t}} = D_X \\nabla ^2 N_X - k_{on} C_A N_X + k_{off} N_B \\quad \\text{on} \\; \\Gamma_{PM}\\\\\n", + "\\frac{\\partial{N_B}}{\\partial{t}} = D_B \\nabla ^2 N_B + k_{on} C_A N_X - k_{off} N_B \\quad \\text{on} \\; \\Gamma_{PM}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b224bea7", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import matplotlib.image as mpimg\n", + "img_A = mpimg.imread('axb-diagram.png')\n", + "plt.imshow(img_A)\n", + "plt.axis('off')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "a59f3428", + "metadata": {}, + "source": [ + "Imports and logger initialization:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc398816", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "import dolfin as d\n", + "import sympy as sym\n", + "import numpy as np\n", + "import pathlib\n", + "import logging\n", + "import gmsh # must be imported before pyvista if dolfin is imported first\n", + "\n", + "from smart import config, common, mesh, model, mesh_tools, visualization\n", + "from smart.units import unit\n", + "from smart.model_assembly import (\n", + " Compartment,\n", + " Parameter,\n", + " Reaction,\n", + " Species,\n", + " SpeciesContainer,\n", + " ParameterContainer,\n", + " CompartmentContainer,\n", + " ReactionContainer,\n", + " Form,\n", + ")\n", + "from matplotlib import pyplot as plt\n", + "import matplotlib.image as mpimg\n", + "\n", + "logger = logging.getLogger(\"smart\")\n", + "logger.setLevel(logging.INFO)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "95b9d865", + "metadata": {}, + "source": [ + "First, we define the various units for use in the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f4023cf", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "um = unit.um\n", + "molecule = unit.molecule\n", + "sec = unit.sec\n", + "dimensionless = unit.dimensionless\n", + "D_unit = um**2 / sec\n", + "surf_unit = molecule / um**2\n", + "flux_unit = molecule / (um * sec)\n", + "edge_unit = molecule / um" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "46582d26", + "metadata": {}, + "source": [ + "Next we generate the model by assembling the compartment, species, parameter, and reaction containers (see Example 1 or API documentation for more details)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09079b17", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "# =============================================================================================\n", + "# Compartments\n", + "# =============================================================================================\n", + "# name, topological dimensionality, length scale units, marker value\n", + "Cyto = Compartment(\"Cyto\", 2, um, 1, vel=(\"-0.1*y*(1 - (x**2+y**2))\",\"0.1*x*(1 - (x**2+y**2))\",\"0\"))\n", + "PM = Compartment(\"PM\", 1, um, 3)\n", + "cc = CompartmentContainer()\n", + "cc.add([Cyto, PM])\n", + "\n", + "# =============================================================================================\n", + "# Species\n", + "# =============================================================================================\n", + "# name, initial concentration, concentration units, diffusion, diffusion units, compartment\n", + "A = Species(\"A\", \"10*exp(-(x**2+(y-0.8)**2)/0.2**2)\", surf_unit, 0.001, D_unit, \"Cyto\")\n", + "X = Species(\"X\", 1.0, edge_unit, 1.0, D_unit, \"PM\")\n", + "B = Species(\"B\", 0.0, edge_unit, 1.0, D_unit, \"PM\")\n", + "sc = SpeciesContainer()\n", + "sc.add([A, X, B])\n", + "\n", + "# =============================================================================================\n", + "# Parameters and Reactions\n", + "# =============================================================================================\n", + "\n", + "# Reaction of A and X to make B (Cyto-PM reaction)\n", + "kon = Parameter(\"kon\", 0.0, 1/(surf_unit*sec))\n", + "koff = Parameter(\"koff\", 1.0, 1/sec)\n", + "r1 = Reaction(\"r1\", [\"A\", \"X\"], [\"B\"],\n", + " param_map={\"on\": \"kon\", \"off\": \"koff\"},\n", + " species_map={\"A\": \"A\", \"X\": \"X\", \"B\": \"B\"})\n", + "\n", + "pc = ParameterContainer()\n", + "pc.add([kon, koff])\n", + "rc = ReactionContainer()\n", + "rc.add([r1])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "15c35d39", + "metadata": {}, + "source": [ + "Now we create a circular mesh (mesh built using gmsh in `smart.mesh_tools`), along with marker functions `mf2` and `mf1`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe56e162", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "# Create mesh\n", + "h_ellipse = 0.1\n", + "xrad = 1.0\n", + "yrad = 1.0\n", + "surf_tag = 1\n", + "edge_tag = 3\n", + "ellipse_mesh, mf1, mf2 = mesh_tools.create_ellipses(xrad, yrad, hEdge=h_ellipse,\n", + " outer_tag=surf_tag, outer_marker=edge_tag)\n", + "visualization.plot_dolfin_mesh(ellipse_mesh, mf2, view_xy=True)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "fe04ad6b", + "metadata": {}, + "source": [ + "Write mesh and meshfunctions to file, then create `mesh.ParentMesh` object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e15255a1", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "mesh_folder = pathlib.Path(\"ellipse_mesh_AR1\")\n", + "mesh_folder.mkdir(exist_ok=True)\n", + "mesh_file = mesh_folder / \"ellipse_mesh.h5\"\n", + "mesh_tools.write_mesh(ellipse_mesh, mf1, mf2, mesh_file)\n", + "\n", + "parent_mesh = mesh.ParentMesh(\n", + " mesh_filename=str(mesh_file),\n", + " mesh_filetype=\"hdf5\",\n", + " name=\"parent_mesh\",\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "d1c0cab2", + "metadata": {}, + "source": [ + "Initialize model and solvers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b059df37", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "config_cur = config.Config()\n", + "config_cur.solver.update(\n", + " {\n", + " \"final_t\": 10.0,\n", + " \"initial_dt\": 0.05,\n", + " \"time_precision\": 6,\n", + " }\n", + ")\n", + "\n", + "model_cur = model.Model(pc, sc, cc, rc, config_cur, parent_mesh)\n", + "model_cur.initialize()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "e97c54a3", + "metadata": {}, + "source": [ + "Save model information to .pkl file and write initial conditions to file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "274cc41d", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "model_cur.to_pickle('model_cur.pkl')\n", + "results = dict()\n", + "result_folder = pathlib.Path(\"resultsEllipse_AR1_withLagrangeRecalc\")\n", + "result_folder.mkdir(exist_ok=True)\n", + "for species_name, species in model_cur.sc.items:\n", + " results[species_name] = d.XDMFFile(\n", + " model_cur.mpi_comm_world, str(result_folder / f\"{species_name}.xdmf\")\n", + " )\n", + " results[species_name].parameters[\"flush_output\"] = True\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + "\n", + "# save deformation field as well\n", + "V_vector = sc[\"A\"].compartment.vel_func.function_space()\n", + "V = d.FunctionSpace(cc[\"Cyto\"].dolfin_mesh, \"P\", 1)\n", + "velfile = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"vel.xdmf\"))\n", + "velfile.parameters[\"flush_output\"] = True\n", + "velfile.write(sc[\"A\"].compartment.vel_func, model_cur.t)\n", + "udef = d.Function(V_vector)\n", + "# uexpr = d.Expression(('-0.1*t*x[1]*(1 - (pow(x[0],2)+pow(x[1],2)))', \n", + "# '0.1*t*x[0]*(1 - (pow(x[0],2)+pow(x[1],2)))', '0'),\n", + "# degree=1, t=tval)\n", + "# uvar = d.interpolate(uexpr, V_vector)\n", + "ufile = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"uvar.xdmf\"))\n", + "ufile.parameters[\"flush_output\"] = True\n", + "ufile.write(udef, model_cur.t)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "355a426e", + "metadata": {}, + "source": [ + "Solve the system until `model_cur.t > model_cur.final_t`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40b213ea", + "metadata": { + "metadata": {} + }, + "outputs": [], + "source": [ + "tvec = [0]\n", + "dx_Cyto = d.Measure(\"dx\", domain=model_cur.cc['Cyto'].dolfin_mesh)\n", + "dx_PM = d.Measure(\"dx\", domain=model_cur.cc['PM'].dolfin_mesh)\n", + "volume = d.assemble_mixed(1.0*dx_Cyto)\n", + "PM_SA = d.assemble_mixed(1.0*dx_PM)\n", + "avg_A = [d.assemble_mixed(A.u['u']*dx_Cyto) / volume]\n", + "avg_X = [d.assemble_mixed(X.u[\"u\"]*dx_PM) / PM_SA]\n", + "avg_B = [d.assemble_mixed(B.u[\"u\"]*dx_PM) / PM_SA]\n", + "# Set loglevel to warning in order not to pollute notebook output\n", + "logger.setLevel(logging.WARNING)\n", + "# variables for lagrangian mapping\n", + "linear_wrt_comp = {k: True for k in model_cur.cc.keys}\n", + "x = d.SpatialCoordinate(sc[\"A\"].compartment.dolfin_mesh)\n", + "xcur = x[0]\n", + "ycur = x[1]\n", + "u = sc[\"A\"]._usplit[\"u\"]\n", + "un = sc[\"A\"]._usplit[\"n\"]\n", + "v = sc[\"A\"].v\n", + "dx = sc[\"A\"].compartment.mesh.dx\n", + "Dform_units = (\n", + " sc[\"A\"].diffusion_units\n", + " * sc[\"A\"].concentration_units\n", + " * sc[\"A\"].compartment.compartment_units ** (sc[\"A\"].compartment.dimensionality - 2)\n", + " )\n", + "mass_form_units = (\n", + " sc[\"A\"].concentration_units / unit.s\n", + " * sc[\"A\"].compartment.compartment_units**sc[\"A\"].compartment.dimensionality\n", + " )\n", + "D_constant = d.Constant(sc[\"A\"].D, name=f\"D_{species.name}\")\n", + "vel = sc[\"A\"].compartment.vel_func\n", + "I = d.Identity(3)\n", + "\n", + "while True:\n", + " # Solve the system\n", + " model_cur.monolithic_solve()\n", + " # Save results for post processing\n", + " for species_name, species in model_cur.sc.items:\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + " avg_A.append(d.assemble_mixed(A.u['u']*dx_Cyto) / volume)\n", + " avg_X.append(d.assemble_mixed(X.u[\"u\"]*dx_PM) / PM_SA)\n", + " avg_B.append(d.assemble_mixed(B.u[\"u\"]*dx_PM) / PM_SA)\n", + " tvec.append(model_cur.t)\n", + " # save deformation\n", + " # tval.assign(model_cur.t)\n", + " # uvar.assign(d.interpolate(uexpr, V_vector))\n", + " # ufile.write(uvar, model_cur.t)\n", + " # update Lagrangian operators\n", + " udef.assign(udef + vel*d.Constant(model_cur.tvec[-1]-model_cur.tvec[-2]))\n", + " ufile.write(udef, model_cur.t)\n", + " xcur = x[0] + udef[0]\n", + " ycur = x[1] + udef[1]\n", + " vcur_x = d.project(-0.1*ycur*(1 - (xcur**2+ycur**2)), V_vector.sub(0).collapse())\n", + " vcur_y = d.project(0.1*xcur*(1 - (xcur**2+ycur**2)), V_vector.sub(1).collapse())\n", + " vel.vector()[V_vector.sub(0).dofmap().dofs()] = vcur_x.vector()\n", + " vel.vector()[V_vector.sub(1).dofmap().dofs()] = vcur_y.vector()\n", + " vel.vector().apply(\"insert\")\n", + " \n", + " velfile.write(vel, model_cur.t)\n", + " F = I + d.grad(udef)\n", + " J = d.det(F)\n", + " if model_cur.config.flags[\"axisymmetric_model\"]:\n", + " Dform = x[0]*D_constant * J * d.inner(d.dot(d.inv(F.T), d.grad(u)),d.dot(d.inv(F.T), d.grad(v)))*dx\n", + " else:\n", + " Dform = D_constant * J * d.inner(d.dot(d.inv(F.T), d.grad(u)),d.dot(d.inv(F.T), d.grad(v)))*dx\n", + " model_cur.forms[\"diffusion_A\"] = Form(\n", + " f\"diffusion_{sc['A'].name}\",\n", + " Dform,\n", + " sc[\"A\"],\n", + " \"diffusion\",\n", + " Dform_units,\n", + " True,\n", + " linear_wrt_comp,\n", + " )\n", + " if model_cur.config.flags[\"axisymmetric_model\"]:\n", + " Aform = J*x[0] * (u*v*d.inner(d.inv(F.T),d.grad(vel))*dx)\n", + " else:\n", + " Aform = J*u*v*d.inner(d.inv(F.T),d.grad(vel))*dx\n", + " model_cur.forms[\"advection_A\"] = Form(\n", + " f\"advection_A\",\n", + " Aform,\n", + " sc[\"A\"],\n", + " \"advection\",\n", + " mass_form_units,\n", + " True,\n", + " linear_wrt_comp,\n", + " )\n", + " if model_cur.config.flags[\"axisymmetric_model\"]:\n", + " Muform = J*x[0] * (u) * v / model_cur.dT * dx\n", + " Munform = J*x[0] * (-un) * v / model_cur.dT * dx\n", + " else:\n", + " Muform = J*(u) * v / model_cur.dT * dx\n", + " Munform = J*(-un) * v / model_cur.dT * dx\n", + " model_cur.forms[\"mass_u_A\"] = Form(\n", + " \"mass_u_A\",\n", + " Muform,\n", + " sc[\"A\"],\n", + " \"mass_u\",\n", + " mass_form_units,\n", + " True,\n", + " linear_wrt_comp,\n", + " )\n", + " model_cur.forms[\"mass_un_A\"] = Form(\n", + " f\"mass_un_A\",\n", + " Munform,\n", + " sc[\"A\"],\n", + " \"mass_un\",\n", + " mass_form_units,\n", + " True,\n", + " linear_wrt_comp,\n", + " )\n", + " model_cur.initialize_discrete_variational_problem_and_solver()\n", + " print(f\"Done with time {model_cur.t} s\")\n", + " # End if we've passed the final time\n", + " if model_cur.t >= model_cur.final_t:\n", + " break" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "52c0fd7e", + "metadata": {}, + "source": [ + "Now we plot the concentration of A in the cell over time and compare this to analytical predictions for a high value of the diffusion coefficient. As $D_A \\rightarrow \\infty$, the steady state concentration of A will be given by the positive root of the following polynomial:\n", + "\n", + "$$\n", + "-k_{on} c_A ^2 - \\left( k_{on} c_{X} (t=0) \\frac{SA_{PM}}{vol_{cyto}} + k_{off} - k_{on} c_A (t=0) \\right) c_A + k_{off} c_A(t=0)\n", + "$$\n", + "\n", + "Note that in this 2D case, $SA_{PM}$ is the perimeter of the ellipse and $vol_{cyto}$ is the area of the ellipse. These can be thought of as a surface area and volume if we extrude the 2D shape by some characteristic thickness." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4afd3149", + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(tvec, avg_A, label='SMART simulation')\n", + "plt.xlabel('Time (s)')\n", + "plt.ylabel('A concentration $\\mathrm{(molecules/μm^2)}$')\n", + "SA_vol = 4/(xrad + yrad)\n", + "root_vals = np.roots([-kon.value,\n", + " -kon.value*avg_X[0]*SA_vol - koff.value + kon.value*avg_A[0],\n", + " koff.value*avg_A[0]])\n", + "ss_pred = root_vals[root_vals > 0]\n", + "plt.plot(tvec, np.ones(len(avg_A))*ss_pred, '--', label='Steady-state analytical prediction')\n", + "plt.legend()\n", + "percent_error_analytical = 100*np.abs(ss_pred-avg_A[-1])/ss_pred\n", + "assert percent_error_analytical < 0.1,\\\n", + " f\"Failed test: Example 2 results deviate {percent_error_analytical:.3f}% from the analytical prediction\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffae481c", + "metadata": {}, + "outputs": [], + "source": [ + "from cowpy import cow\n", + "if True:#percent_error_analytical > 0.1:\n", + " stegy = cow.Stegosaurus(thoughts=True)\n", + " stegy_msg = stegy.milk(\"Failed test: Example 2 results deviate from the analytical prediction\")\n", + " print(stegy_msg)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "05f30a3c", + "metadata": {}, + "source": [ + "Plot A concentration in the cell at the final time point." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d950b475", + "metadata": {}, + "outputs": [], + "source": [ + "visualization.plot(model_cur.sc[\"A\"].u[\"u\"], view_xy=True)\n", + "# also save to file for comparison visualization in the end\n", + "meshimg_folder = pathlib.Path(\"mesh_images\")\n", + "meshimg_folder = meshimg_folder.resolve()\n", + "meshimg_folder.mkdir(exist_ok=True)\n", + "meshimg_file = meshimg_folder / \"ellipse_mesh_AR1.png\"" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/smart/model.py b/smart/model.py index 8f51475..6e8246b 100644 --- a/smart/model.py +++ b/smart/model.py @@ -1035,6 +1035,25 @@ def _init_4_7_set_initial_conditions(self): new_vals = vec_new[mesh_map] # reorder to match dof ordering vec.set_local(new_vals) vec.apply("insert") + for compartment in self._active_compartments: + # if vel is string, generate expr for advection + if compartment.vel != 0: + x, y, z = (sym.Symbol(f"x[{i}]") for i in range(3)) + vel_expr = [None] * len(compartment.vel) + # then this needs to have free symbols inserted + for i in range(len(compartment.vel)): + vel_str = compartment.vel[i] + # Parse the given string to create a sympy expression + sym_expr = parse_expr(vel_str).subs({"x": x, "y": y, "z": z, "t": self.t}) + free_symbols = [str(x) for x in sym_expr.free_symbols] + if not {"x[0]", "x[1]", "x[2]"}.issuperset(free_symbols): + # could add other keywords for spatial dependence in the future + raise NotImplementedError + else: + vel_expr[i] = sym.printing.ccode(sym_expr) + compartment.vel_expr = d.Expression(vel_expr, degree=1) + V_vector = d.VectorFunctionSpace(compartment.dolfin_mesh, "P", 1) + compartment.vel_func = d.interpolate(compartment.vel_expr, V_vector) def _init_5_1_reactions_to_fluxes(self): """Convert reactions to flux objects""" @@ -1110,20 +1129,79 @@ def _init_5_2_create_variational_forms(self): extra=dict(format_type="log"), ) else: - D_constant = d.Constant(D, name=f"D_{species.name}") - if self.config.flags["axisymmetric_model"]: - Dform = x[0] * D_constant * d.inner(d.grad(u), d.grad(v)) * dx + lagrange = True + if lagrange and species.compartment.vel != 0: # then nonzero advection + # alt Lagrangian form + D_constant = d.Constant(D, name=f"D_{species.name}") + vel = species.compartment.vel_func + udef = vel * d.Constant(self.t - self.tvec[0]) + F = d.Identity(3) + d.grad(udef) + J = d.det(F) + if self.config.flags["axisymmetric_model"]: + Dform = ( + x[0] + * D_constant + * J + * d.inner(d.dot(d.inv(F.T), d.grad(u)), d.dot(d.inv(F.T), d.grad(v))) + * dx + ) + else: + Dform = ( + D_constant + * J + * d.inner(d.dot(d.inv(F.T), d.grad(u)), d.dot(d.inv(F.T), d.grad(v))) + * dx + ) + self.forms.add( + Form( + f"diffusion_{species.name}", + Dform, + species, + "diffusion", + Dform_units, + True, + linear_wrt_comp, + ) + ) else: - Dform = D_constant * d.inner(d.grad(u), d.grad(v)) * dx - # exponent is -2 because of two gradients + D_constant = d.Constant(D, name=f"D_{species.name}") + if self.config.flags["axisymmetric_model"]: + Dform = x[0] * D_constant * d.inner(d.grad(u), d.grad(v)) * dx + else: + Dform = D_constant * d.inner(d.grad(u), d.grad(v)) * dx + # exponent is -2 because of two gradients + + self.forms.add( + Form( + f"diffusion_{species.name}", + Dform, + species, + "diffusion", + Dform_units, + True, + linear_wrt_comp, + ) + ) + if species.compartment.vel != 0: # then nonzero advection + vel = species.compartment.vel_func + if lagrange: + if self.config.flags["axisymmetric_model"]: + Aform = J * x[0] * (u * v * d.inner(d.inv(F), d.grad(vel)) * dx) + else: + Aform = J * u * v * d.inner(d.inv(F), d.grad(vel)) * dx + else: + if self.config.flags["axisymmetric_model"]: + Aform = x[0] * (u * v * d.div(vel) * dx + d.inner(v * vel, d.grad(u))) + else: + Aform = u * v * d.div(vel) * dx + d.inner(v * vel, d.grad(u)) * dx self.forms.add( Form( - f"diffusion_{species.name}", - Dform, + f"advection_{species.name}", + Aform, species, - "diffusion", - Dform_units, + "advection", + mass_form_units, True, linear_wrt_comp, ) diff --git a/smart/model_assembly.py b/smart/model_assembly.py index b8c6ef0..7b40ac5 100644 --- a/smart/model_assembly.py +++ b/smart/model_assembly.py @@ -1135,12 +1135,14 @@ class Compartment(ObjectInstance): dimensionality: topological dimensionality (e.g. 3 for volume, 2 for surface) compartment_units: length units for the compartment cell_marker: marker value identifying the compartment in the parent mesh + vel: string expression for advective velocity field within compartment """ name: str dimensionality: int compartment_units: pint.Unit cell_marker: Any + vel: Union[str, float] = 0.0 def to_dict(self): "Convert to a dict that can be used to recreate the object." @@ -1170,6 +1172,8 @@ def __post_init__(self): self._usplit = dict() self.V = None self.v = None + self.vel_expr = None + self.vel_func = None def check_validity(self): """ From 9ef3822fd50d7e4ea01cbfd36e16e3e58d942da7 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Sat, 12 Jul 2025 19:03:46 -0700 Subject: [PATCH 07/25] Add new meshing function for multicellular meshes --- smart/mesh_tools.py | 153 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 145 insertions(+), 8 deletions(-) diff --git a/smart/mesh_tools.py b/smart/mesh_tools.py index fb04478..43456c1 100644 --- a/smart/mesh_tools.py +++ b/smart/mesh_tools.py @@ -719,6 +719,143 @@ def meshSizeCallback(dim, tag, x, y, z, lc): return (dmesh, mf2, mf3) +def create_multicell( + cubeSize: float = 100.0, + locVec: list = [[0, 0, 0]], + cellRad: float = 10.0, + hCube: float = 0, + hCell: float = 0, + interface_marker: int = 12, + outer_marker: int = 10, + extracell_tag: int = 2, + cell_vol_tag: int = 1, + comm: MPI.Comm = d.MPI.comm_world, + verbose: bool = False, +) -> Tuple[d.Mesh, d.MeshFunction, d.MeshFunction]: + """ + Creates a mesh with an outer cube containing embedded cells at specified locations. + Args: + cubeSize: Length of cube sides + locVec: vector of cell locations + hCube: maximum mesh size for cube + hCell: maximum mesh size for cell surfaces + interface_marker: The value to mark facets on the interface with + outer_marker: The value to mark facets on the outer ellipsoid with + inner_vol_tag: The value to mark the inner spherical volume with + outer_vol_tag: The value to mark the outer spherical volume with + comm: MPI communicator to create the mesh with + verbose: If true print gmsh output, else skip + Returns: + A triplet (mesh, facet_marker, cell_marker) + """ + import gmsh + + if np.isclose(cubeSize, 0): + ValueError("Outer cube size is equal to zero") + if np.isclose(hCube, 0): + hCube = 0.1 * max(cubeSize) + if np.isclose(hCell, 0): + hCell = 0.2 * cubeSize if np.isclose(cellRad, 0) else 0.2 * cellRad + # if innerRad > outerRad or innerLength >= outerLength: + # ValueError("Inner cylinder does not fit inside outer cylinder") + # Create the two cylinder mesh using gmsh + gmsh.initialize() + gmsh.option.setNumber("General.Terminal", int(verbose)) + + gmsh.model.add("multicell") + # first add outer cube + cube = gmsh.model.occ.addBox( + -cubeSize / 2, -cubeSize / 2, -cubeSize / 2, cubeSize, cubeSize, cubeSize + ) + if np.isclose(cellRad, 0): + # Just a cube! + gmsh.model.occ.synchronize() + gmsh.model.add_physical_group(3, [cube], tag=extracell_tag) + facets = gmsh.model.getBoundary([(3, cube)]) + gmsh.model.add_physical_group(2, [facets[0][1]], tag=outer_marker) + else: + # Add cells + cell_list = [] + for i in range(len(locVec)): + cur_tag = gmsh.model.occ.addSphere(locVec[i][0], locVec[i][1], locVec[i][2], cellRad) + cell_list.append((3, cur_tag)) + # Create interface between cells and extracell + full_geo, maps = gmsh.model.occ.fragment([(3, cube)], cell_list) + cube_map = maps[0] + cell_maps = maps[1:] + gmsh.model.occ.synchronize() + + # Get the outer boundary + outer_shells = gmsh.model.getBoundary(full_geo, oriented=False) + # Get the inner boundary + inner_shells = [] + for i in range(len(cell_maps)): + inner_shells.append(gmsh.model.getBoundary(cell_maps[i], oriented=False)) + # Add physical markers for facets + gmsh.model.add_physical_group(2, [faces[1] for faces in outer_shells], tag=outer_marker) + gmsh.model.add_physical_group( + 2, [faces[0][1] for faces in inner_shells], tag=interface_marker + ) + + # Physical markers for + all_volumes = [tag[1] for tag in cube_map] + inner_volume = [tag[0][1] for tag in cell_maps] + outer_volume = [] + for vol in all_volumes: + if vol not in inner_volume: + outer_volume.append(vol) + gmsh.model.add_physical_group(3, outer_volume, tag=extracell_tag) + gmsh.model.add_physical_group(3, inner_volume, tag=cell_vol_tag) + + def meshSizeCallback(dim, tag, x, y, z, lc): + # mesh length is hEdge at the PM (defaults to 0.1*outerRad, + # or set when calling function) and hInnerEdge at the ERM + # (defaults to 0.2*innerRad, or set when calling function) + # between these, the value is interpolated based on r (polar coord), + # and inside the value is interpolated between hInnerEdge and 0.2*innerRad + # if innerRad=0, then the mesh length is interpolated between + # hEdge at the PM and 0.2*outerRad in the center + + if np.isclose(cellRad, 0): + return hCube + cell_locs = np.sqrt( + (x - np.array(locVec)[:, 0]) ** 2 + + (y - np.array(locVec)[:, 1]) ** 2 + + (z - np.array(locVec)[:, 2]) ** 2 + ) + closest_cell = min(cell_locs) + cellWeight = np.exp(-(closest_cell - cellRad) / (0.2 * cellRad)) + if closest_cell < cellRad: + return hCell + else: + return hCell * cellWeight + hCube * (1 - cellWeight) + + gmsh.model.mesh.setSizeCallback(meshSizeCallback) + # set off the other options for mesh size determination + gmsh.option.setNumber("Mesh.MeshSizeExtendFromBoundary", 0) + gmsh.option.setNumber("Mesh.MeshSizeFromPoints", 0) + gmsh.option.setNumber("Mesh.MeshSizeFromCurvature", 0) + # this changes the algorithm from Frontal-Delaunay to Delaunay, + # which may provide better results when there are larger gradients in mesh size + gmsh.option.setNumber("Mesh.Algorithm", 5) + + gmsh.model.mesh.generate(3) + rank = MPI.COMM_WORLD.rank + tmp_folder = pathlib.Path(f"tmp_extracell_{cubeSize}_{cellRad}_{rank}") + tmp_folder.mkdir(exist_ok=True) + gmsh_file = tmp_folder / "extracell.msh" + gmsh.write(str(gmsh_file)) + gmsh.finalize() + + # return dolfin mesh of max dimension (parent mesh) and marker functions mf2 and mf3 + dmesh, mf2, mf3 = gmsh_to_dolfin(str(gmsh_file), tmp_folder, 3, comm) + # remove tmp mesh and tmp folder + gmsh_file.unlink(missing_ok=False) + tmp_folder.rmdir() + # return dolfin mesh, mf2 (2d tags) and mf3 (3d tags) + return (dmesh, mf2, mf3) + + def create_ellipses( xrad_outer: float = 3.0, yrad_outer: float = 1.0, @@ -1547,11 +1684,11 @@ def meshSizeCallback(dim, tag, x, y, z, lc): gmsh.finalize() # return dolfin mesh of max dimension (parent mesh) and marker functions mf2 and mf3 - dmesh, mf2, mf3 = gmsh_to_dolfin(str(gmsh_file), tmp_folder, 2, comm) + dmesh, mf1, mf2 = gmsh_to_dolfin(str(gmsh_file), tmp_folder, 2, comm) # remove tmp mesh and tmp folder gmsh_file.unlink(missing_ok=False) tmp_folder.rmdir() - # return dolfin mesh, mf2 (2d tags) and mf3 (3d tags) + # return dolfin mesh, mf1 (1d tags) and mf2 (2d tags) if return_curvature: if innerExpr == "": facet_list = [outer_marker] @@ -1560,7 +1697,7 @@ def meshSizeCallback(dim, tag, x, y, z, lc): facet_list = [outer_marker, interface_marker] cell_list = [outer_tag, inner_tag] if half_cell_with_curvature: # will likely not work in parallel... - dmesh_half, mf2_half, mf3_half = create_2Dcell( + dmesh_half, mf1_half, mf2_half = create_2Dcell( outerExpr, innerExpr, hEdge, @@ -1575,14 +1712,14 @@ def meshSizeCallback(dim, tag, x, y, z, lc): return_curvature=False, ) kappa_mf = compute_curvature( - dmesh, mf2, mf3, facet_list, cell_list, half_mesh_data=(dmesh_half, mf2_half) + dmesh, mf1, mf2, facet_list, cell_list, half_mesh_data=(dmesh_half, mf1_half) ) - (dmesh, mf2, mf3) = (dmesh_half, mf2_half, mf3_half) + (dmesh, mf1, mf2) = (dmesh_half, mf1_half, mf2_half) else: - kappa_mf = compute_curvature(dmesh, mf2, mf3, facet_list, cell_list) - return (dmesh, mf2, mf3, kappa_mf) + kappa_mf = compute_curvature(dmesh, mf1, mf2, facet_list, cell_list) + return (dmesh, mf1, mf2, kappa_mf) else: - return (dmesh, mf2, mf3) + return (dmesh, mf1, mf2) def gmsh_to_dolfin( From b1d24be32953cceb33ccb852aff7becdaad96bef Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Mon, 14 Jul 2025 10:25:03 -0700 Subject: [PATCH 08/25] Update new example 7 for testing reaction-diffusion through multicellular network, ensure non-negativity of solution --- examples/example7/example7.ipynb | 304 +++++++++++++++++++++++++++++++ smart/mesh_tools.py | 101 +++++++--- 2 files changed, 379 insertions(+), 26 deletions(-) create mode 100644 examples/example7/example7.ipynb diff --git a/examples/example7/example7.ipynb b/examples/example7/example7.ipynb new file mode 100644 index 0000000..2c86caa --- /dev/null +++ b/examples/example7/example7.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f65f18d7", + "metadata": {}, + "source": [ + "# Example 7: Reaction-diffusion of molecule in a multicellular network\n", + "\n", + "Here, we consider the diffusion of a molecule from a central cell in a multicellular mesh to other cells in the environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc398816", + "metadata": {}, + "outputs": [], + "source": [ + "import dolfin as d\n", + "import sympy as sym\n", + "import numpy as np\n", + "import pathlib\n", + "import logging\n", + "import gmsh # must be imported before pyvista if dolfin is imported first\n", + "\n", + "from smart import config, mesh, model, mesh_tools, visualization\n", + "from smart.units import unit\n", + "from smart.model_assembly import (\n", + " Compartment,\n", + " Parameter,\n", + " Reaction,\n", + " Species,\n", + " SpeciesContainer,\n", + " ParameterContainer,\n", + " CompartmentContainer,\n", + " ReactionContainer,\n", + ")\n", + "\n", + "from matplotlib import pyplot as plt\n", + "import matplotlib.image as mpimg\n", + "from matplotlib import rcParams\n", + "\n", + "logger = logging.getLogger(\"smart\")\n", + "logger.setLevel(logging.INFO)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "95b9d865", + "metadata": {}, + "source": [ + "We define the relevant units here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f4023cf", + "metadata": {}, + "outputs": [], + "source": [ + "# Aliases - base units\n", + "uM = unit.uM\n", + "um = unit.um\n", + "molecule = unit.molecule\n", + "sec = unit.sec\n", + "dimensionless = unit.dimensionless\n", + "# Aliases - units used in model\n", + "D_unit = um**2 / sec\n", + "flux_unit = uM * um / sec\n", + "vol_unit = uM\n", + "surf_unit = molecule / um**2" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "46582d26", + "metadata": {}, + "source": [ + "## Model generation\n", + "\n", + "We define the compartments and species first, with their respective containers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02a000f2", + "metadata": {}, + "outputs": [], + "source": [ + "EC = Compartment(\"EC\", 3, um, 1)\n", + "PM1 = Compartment(\"PM1\", 2, um, 11) # source cell\n", + "PM2 = Compartment(\"PM2\", 2, um, 12) # other cells\n", + "PM1.specify_nonadjacency(['PM2'])\n", + "PM2.specify_nonadjacency(['PM1'])\n", + "\n", + "cc = CompartmentContainer()\n", + "cc.add([EC, PM1, PM2])\n", + "\n", + "G = Species(\"G\", 1.0, vol_unit, 1000.0, D_unit, \"EC\")\n", + "Rbound = Species(\"Rbound\", 0.0, surf_unit, 0.0, D_unit, \"PM2\")\n", + "sc = SpeciesContainer()\n", + "sc.add([G, Rbound])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3c56e840", + "metadata": {}, + "source": [ + "Define parameters and reactions, then place in respective containers. Here, there are 3 reactions:\n", + "* r1: release of G from PM1\n", + "* r2: binding of G to PM2\n", + "* r3: degradation of G" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e1f6882", + "metadata": {}, + "outputs": [], + "source": [ + "# G release from cell 1\n", + "j1pulse = Parameter(\"j1pulse\", 1000.0, flux_unit)\n", + "r1 = Reaction(\n", + " \"r1\",\n", + " [],\n", + " [\"G\"],\n", + " param_map={\"J\": \"j1pulse\"},\n", + " eqn_f_str=\"J\",\n", + " explicit_restriction_to_domain=\"PM1\",\n", + ")\n", + "# G binding to PM2\n", + "Rtot = Parameter(\"Rtot\", 100.0, surf_unit)\n", + "kbind = Parameter(\"kbind\", 1.0, 1/(uM*sec))\n", + "kunbind = Parameter(\"kunbind\", 0.01, 1/sec)\n", + "r2 = Reaction(\"r2\", [\"G\"], [\"Rbound\"],\n", + " param_map={\"on\":\"kbind\",\"off\":\"kunbind\",\"Rtot\":\"Rtot\"},\n", + " eqn_f_str=\"on*G*(Rtot-Rbound) - off*Rbound\",\n", + " explicit_restriction_to_domain=\"PM2\")\n", + "\n", + "# G degradation\n", + "kdeg = Parameter(\"kdeg\", 0.01, 1/sec)\n", + "r3 = Reaction(\"r3\", [\"G\"], [], param_map={\"k\":\"kdeg\"},\n", + " eqn_f_str=\"k*G\")\n", + "\n", + "pc = ParameterContainer()\n", + "pc.add([j1pulse,Rtot,kbind,kunbind,kdeg])\n", + "rc = ReactionContainer()\n", + "rc.add([r1,r2,r3])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "15c35d39", + "metadata": {}, + "source": [ + "## Create and load in mesh\n", + "\n", + "Here, we consider cells embedded in a cube mesh. The source cell is located at (0,0,0) and 8 other cells are spread equidistant through the mesh." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe56e162", + "metadata": {}, + "outputs": [], + "source": [ + "domain, facet_markers, cell_markers = mesh_tools.create_multicell(cubeSize=100.0, locVec1=[[0,0,0]],\n", + " locVec2=[[-30,-30,-30], [-30,30,-30], [-30,-30,30], [-30,30,30], \n", + " [30,-30,-30], [30,30,-30], [30,-30,30], [30,30,30]],\n", + " cellRad1 = 10.0, cellRad2 = 10.0, hCube = 5.0, hCell = 2.0)\n", + "# Write mesh and meshfunctions to file\n", + "mesh_folder = pathlib.Path(\"mesh\")\n", + "mesh_folder.mkdir(exist_ok=True)\n", + "mesh_path = mesh_folder / \"multicell_mesh.h5\"\n", + "mesh_tools.write_mesh(\n", + " domain, facet_markers, cell_markers, filename=mesh_path\n", + ")\n", + "parent_mesh = mesh.ParentMesh(\n", + " mesh_filename=str(mesh_path),\n", + " mesh_filetype=\"hdf5\",\n", + " name=\"parent_mesh\",\n", + ")\n", + "visualization.plot_dolfin_mesh(domain, cell_markers, facet_markers)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "0943588e", + "metadata": {}, + "source": [ + "Initialize model and solver." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac88bdec", + "metadata": {}, + "outputs": [], + "source": [ + "config_cur = config.Config()\n", + "config_cur.flags.update({\"allow_unused_components\": True})\n", + "model_cur = model.Model(pc, sc, cc, rc, config_cur, parent_mesh)\n", + "config_cur.solver.update(\n", + " {\n", + " \"final_t\": 10.0,\n", + " \"initial_dt\": 0.001,\n", + " \"time_precision\": 8,\n", + " \"reset_timestep_for_negative_solution\": True,\n", + " }\n", + ")\n", + "model_cur.initialize()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5d5aacbd", + "metadata": {}, + "source": [ + "Initialize XDMF files for saving results, save model information to .pkl file, then solve the system until `model_cur.t > model_cur.final_t`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b54d28ca", + "metadata": {}, + "outputs": [], + "source": [ + "# Write initial condition(s) to file\n", + "results = dict()\n", + "result_folder = pathlib.Path(f\"results\")\n", + "result_folder.mkdir(exist_ok=True)\n", + "for species_name, species in model_cur.sc.items:\n", + " results[species_name] = d.XDMFFile(\n", + " model_cur.mpi_comm_world, str(result_folder / f\"{species_name}.xdmf\")\n", + " )\n", + " results[species_name].parameters[\"flush_output\"] = True\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + "model_cur.to_pickle(\"model_cur.pkl\")\n", + "\n", + "# Set loglevel to warning in order not to pollute notebook output\n", + "logger.setLevel(logging.WARNING)\n", + "# Solve\n", + "displayed = False\n", + "while True:\n", + " # Solve the system\n", + " model_cur.monolithic_solve()\n", + " model_cur.adjust_dt()\n", + " # Save results for post processing\n", + " for species_name, species in model_cur.sc.items:\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + " print(f\"Done with t={model_cur.t}\")\n", + " # End if we've passed the final time\n", + " if model_cur.t >= model_cur.final_t:\n", + " break" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "vscode": { + "interpreter": { + "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/smart/mesh_tools.py b/smart/mesh_tools.py index 43456c1..4ffabef 100644 --- a/smart/mesh_tools.py +++ b/smart/mesh_tools.py @@ -721,14 +721,18 @@ def meshSizeCallback(dim, tag, x, y, z, lc): def create_multicell( cubeSize: float = 100.0, - locVec: list = [[0, 0, 0]], - cellRad: float = 10.0, + locVec1: list = [[0, 0, 0]], + locVec2: list = [], + cellRad1: float = 10.0, + cellRad2: float = 10.0, hCube: float = 0, hCell: float = 0, - interface_marker: int = 12, + interface_marker1: int = 11, + interface_marker2: int = 12, outer_marker: int = 10, - extracell_tag: int = 2, - cell_vol_tag: int = 1, + extracell_tag: int = 1, + cell_vol_tag1: int = 2, + cell_vol_tag2: int = 3, comm: MPI.Comm = d.MPI.comm_world, verbose: bool = False, ) -> Tuple[d.Mesh, d.MeshFunction, d.MeshFunction]: @@ -755,7 +759,7 @@ def create_multicell( if np.isclose(hCube, 0): hCube = 0.1 * max(cubeSize) if np.isclose(hCell, 0): - hCell = 0.2 * cubeSize if np.isclose(cellRad, 0) else 0.2 * cellRad + hCell = 0.2 * cubeSize if np.isclose(cellRad1, 0) else 0.2 * cellRad1 # if innerRad > outerRad or innerLength >= outerLength: # ValueError("Inner cylinder does not fit inside outer cylinder") # Create the two cylinder mesh using gmsh @@ -767,7 +771,9 @@ def create_multicell( cube = gmsh.model.occ.addBox( -cubeSize / 2, -cubeSize / 2, -cubeSize / 2, cubeSize, cubeSize, cubeSize ) - if np.isclose(cellRad, 0): + if (np.isclose(cellRad1, 0) or len(locVec1) == 0) and ( + np.isclose(cellRad2, 0) or len(locVec2) == 0 + ): # Just a cube! gmsh.model.occ.synchronize() gmsh.model.add_physical_group(3, [cube], tag=extracell_tag) @@ -776,8 +782,17 @@ def create_multicell( else: # Add cells cell_list = [] - for i in range(len(locVec)): - cur_tag = gmsh.model.occ.addSphere(locVec[i][0], locVec[i][1], locVec[i][2], cellRad) + # first add source cell(s) + for i in range(len(locVec1)): + cur_tag = gmsh.model.occ.addSphere( + locVec1[i][0], locVec1[i][1], locVec1[i][2], cellRad1 + ) + cell_list.append((3, cur_tag)) + # now add additional cells + for i in range(len(locVec2)): + cur_tag = gmsh.model.occ.addSphere( + locVec2[i][0], locVec2[i][1], locVec2[i][2], cellRad2 + ) cell_list.append((3, cur_tag)) # Create interface between cells and extracell full_geo, maps = gmsh.model.occ.fragment([(3, cube)], cell_list) @@ -788,24 +803,32 @@ def create_multicell( # Get the outer boundary outer_shells = gmsh.model.getBoundary(full_geo, oriented=False) # Get the inner boundary - inner_shells = [] - for i in range(len(cell_maps)): - inner_shells.append(gmsh.model.getBoundary(cell_maps[i], oriented=False)) + inner_shells1 = [] + inner_shells2 = [] + for i in range(0, len(locVec1)): + inner_shells1.append(gmsh.model.getBoundary(cell_maps[i], oriented=False)) + for i in range(len(locVec1), len(cell_maps)): + inner_shells2.append(gmsh.model.getBoundary(cell_maps[i], oriented=False)) # Add physical markers for facets gmsh.model.add_physical_group(2, [faces[1] for faces in outer_shells], tag=outer_marker) gmsh.model.add_physical_group( - 2, [faces[0][1] for faces in inner_shells], tag=interface_marker + 2, [faces[0][1] for faces in inner_shells1], tag=interface_marker1 + ) + gmsh.model.add_physical_group( + 2, [faces[0][1] for faces in inner_shells2], tag=interface_marker2 ) # Physical markers for all_volumes = [tag[1] for tag in cube_map] - inner_volume = [tag[0][1] for tag in cell_maps] + inner_volumes1 = [tag[0][1] for tag in cell_maps[0 : len(locVec1)]] + inner_volumes2 = [tag[0][1] for tag in cell_maps[len(locVec1) :]] outer_volume = [] for vol in all_volumes: - if vol not in inner_volume: + if (vol not in inner_volumes1) and (vol not in inner_volumes2): outer_volume.append(vol) gmsh.model.add_physical_group(3, outer_volume, tag=extracell_tag) - gmsh.model.add_physical_group(3, inner_volume, tag=cell_vol_tag) + gmsh.model.add_physical_group(3, inner_volumes1, tag=cell_vol_tag1) + gmsh.model.add_physical_group(3, inner_volumes2, tag=cell_vol_tag2) def meshSizeCallback(dim, tag, x, y, z, lc): # mesh length is hEdge at the PM (defaults to 0.1*outerRad, @@ -816,18 +839,44 @@ def meshSizeCallback(dim, tag, x, y, z, lc): # if innerRad=0, then the mesh length is interpolated between # hEdge at the PM and 0.2*outerRad in the center - if np.isclose(cellRad, 0): + if (np.isclose(cellRad1, 0) or len(locVec1) == 0) and ( + np.isclose(cellRad2, 0) or len(locVec2) == 0 + ): return hCube - cell_locs = np.sqrt( - (x - np.array(locVec)[:, 0]) ** 2 - + (y - np.array(locVec)[:, 1]) ** 2 - + (z - np.array(locVec)[:, 2]) ** 2 - ) - closest_cell = min(cell_locs) - cellWeight = np.exp(-(closest_cell - cellRad) / (0.2 * cellRad)) - if closest_cell < cellRad: + elif np.isclose(cellRad1, 0) or len(locVec1) == 0: + cell_locs1 = [np.inf] + cell_locs2 = np.sqrt( + (x - np.array(locVec2)[:, 0]) ** 2 + + (y - np.array(locVec2)[:, 1]) ** 2 + + (z - np.array(locVec2)[:, 2]) ** 2 + ) + elif np.isclose(cellRad2, 0) or len(locVec2) == 0: + cell_locs1 = np.sqrt( + (x - np.array(locVec1)[:, 0]) ** 2 + + (y - np.array(locVec1)[:, 1]) ** 2 + + (z - np.array(locVec1)[:, 2]) ** 2 + ) + cell_locs2 = [np.inf] + else: + cell_locs1 = np.sqrt( + (x - np.array(locVec1)[:, 0]) ** 2 + + (y - np.array(locVec1)[:, 1]) ** 2 + + (z - np.array(locVec1)[:, 2]) ** 2 + ) + cell_locs2 = np.sqrt( + (x - np.array(locVec2)[:, 0]) ** 2 + + (y - np.array(locVec2)[:, 1]) ** 2 + + (z - np.array(locVec2)[:, 2]) ** 2 + ) + closest_cell1 = min(cell_locs1) + closest_cell2 = min(cell_locs2) + if (closest_cell1 < cellRad1) or (closest_cell2 < cellRad2): return hCell else: + if closest_cell1 < closest_cell2: + cellWeight = np.exp(-(closest_cell1 - cellRad1) / (0.2 * cellRad1)) + else: + cellWeight = np.exp(-(closest_cell2 - cellRad2) / (0.2 * cellRad2)) return hCell * cellWeight + hCube * (1 - cellWeight) gmsh.model.mesh.setSizeCallback(meshSizeCallback) @@ -841,7 +890,7 @@ def meshSizeCallback(dim, tag, x, y, z, lc): gmsh.model.mesh.generate(3) rank = MPI.COMM_WORLD.rank - tmp_folder = pathlib.Path(f"tmp_extracell_{cubeSize}_{cellRad}_{rank}") + tmp_folder = pathlib.Path(f"tmp_extracell_{cubeSize}_{cellRad1}_{cellRad2}_{rank}") tmp_folder.mkdir(exist_ok=True) gmsh_file = tmp_folder / "extracell.msh" gmsh.write(str(gmsh_file)) From 25e70770bc1f1b98fa846ec0a2f6acd397ad37bc Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Mon, 14 Jul 2025 10:32:20 -0700 Subject: [PATCH 09/25] bump version number in pyproject --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7a80519..e444256 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.0.0", "wheel"] [project] name = "fenics-smart" -version = "2.3.0" +version = "2.3.0.beta.1" description = "Spatial Modeling Algorithms for Reactions and Transport (SMART) is a high-performance finite-element-based simulation package for model specification and numerical simulation of spatially-varying reaction-transport processes in biological cells." authors = [{ name = "Justin Laughlin", email = "justinglaughlin@gmail.com" }] license = { file = "LICENSE" } From c5e33d7c275758fd3595890c5500acbf8049e9c7 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Sun, 20 Jul 2025 18:17:43 -0700 Subject: [PATCH 10/25] Update Lagrangian formulas, add example 2 file to test Lagrangian vs Eulerian meshes --- examples/example2/example2.ipynb | 1 + examples/example2/example2_lagrangeTest.py | 257 ++++++++++++++++++ .../example2/example2_withadvection.ipynb | 230 +++++++--------- smart/model.py | 169 ++++++++---- smart/model_assembly.py | 83 +++++- 5 files changed, 541 insertions(+), 199 deletions(-) create mode 100644 examples/example2/example2_lagrangeTest.py diff --git a/examples/example2/example2.ipynb b/examples/example2/example2.ipynb index 46b7a3c..5555dfa 100644 --- a/examples/example2/example2.ipynb +++ b/examples/example2/example2.ipynb @@ -429,6 +429,7 @@ " outer_tag=surf_tag, outer_marker=edge_tag)\n", " mesh_folder = pathlib.Path(f\"ellipse_mesh_AR{aspect_ratios[i]}\")\n", " mesh_folder.mkdir(exist_ok=True)\n", + " mesh_file = mesh_folder / \"ellipse_mesh.h5\"\n", " mesh_tools.write_mesh(ellipse_mesh, mf1, mf2, mesh_file)\n", " parent_mesh = mesh.ParentMesh(\n", " mesh_filename=str(mesh_file),\n", diff --git a/examples/example2/example2_lagrangeTest.py b/examples/example2/example2_lagrangeTest.py new file mode 100644 index 0000000..28e05d7 --- /dev/null +++ b/examples/example2/example2_lagrangeTest.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python +# coding: utf-8 + +# # Example 2: Simple 2D cell signaling model +# Test alterations in mesh vs. Lagrangian mapping for different cases + +import dolfin as d +import numpy as np +import pathlib +import logging + +from smart import config, mesh, model, mesh_tools +from smart.units import unit +from smart.model_assembly import ( + Compartment, + Parameter, + Reaction, + Species, + SpeciesContainer, + ParameterContainer, + CompartmentContainer, + ReactionContainer, +) +from matplotlib import pyplot as plt + +logger = logging.getLogger("smart") +logger.setLevel(logging.INFO) + +um = unit.um +molecule = unit.molecule +sec = unit.sec +dimensionless = unit.dimensionless +D_unit = um**2 / sec +surf_unit = molecule / um**2 +flux_unit = molecule / (um * sec) +edge_unit = molecule / um + +# ============================================================================================= +# Compartments +# ============================================================================================= +# name, topological dimensionality, length scale units, marker value +Cyto = Compartment("Cyto", 2, um, 1) +PM = Compartment("PM", 1, um, 3) +cc = CompartmentContainer() +cc.add([Cyto, PM]) + +# ============================================================================================= +# Species +# ============================================================================================= +# name, initial concentration, concentration units, diffusion, diffusion units, compartment +A = Species("A", 1.0, surf_unit, 0.001, D_unit, "Cyto") +X = Species("X", 1.0, edge_unit, 0.001, D_unit, "PM") +B = Species("B", 0.0, edge_unit, 0.001, D_unit, "PM") +sc = SpeciesContainer() +sc.add([A, X, B]) + +# ============================================================================================= +# Parameters and Reactions +# ============================================================================================= + +# Reaction of A and X to make B (Cyto-PM reaction) +kon = Parameter("kon", 1.0, 1 / (surf_unit * sec)) +koff = Parameter("koff", 1.0, 1 / sec) +r1 = Reaction( + "r1", + ["A", "X"], + ["B"], + param_map={"on": "kon", "off": "koff"}, + species_map={"A": "A", "X": "X", "B": "B"}, +) + +pc = ParameterContainer() +pc.add([kon, koff]) +rc = ReactionContainer() +rc.add([r1]) + +h_ellipse = 0.2 +xrad = 1.0 +yrad = 1.0 +surf_tag = 1 +edge_tag = 3 +config_cur = config.Config() +config_cur.solver.update( + { + "final_t": 2.0, + "initial_dt": 0.1, + "time_precision": 6, + } +) + +# iterate over additional aspect ratios, enforcing the same ellipsoid area in all cases +aspect_ratios = [1, 1.5**2, 4, 9, 16] +l2_lagrange = [] +l2_eul = [] +Avecs = [] + +parent_folder = pathlib.Path("lagrange_testing") +parent_folder.mkdir(exist_ok=True) + +for i in range(len(aspect_ratios)): + + udefs = [] + lagrangeSS = [] + refSS = [] + for lagrange in [False, True]: + if lagrange: + Cyto = Compartment( + "Cyto", + 2, + um, + 1, + deform=( + f"x*{np.sqrt(aspect_ratios[i])-1}", + f"y*{1/np.sqrt(aspect_ratios[i]) - 1}", + "0", + ), + ) + PM = Compartment( + "PM", + 1, + um, + 3, + deform=( + f"x*{np.sqrt(aspect_ratios[i])-1}", + f"y*{1/np.sqrt(aspect_ratios[i]) - 1}", + "0", + ), + ) + else: + Cyto = Compartment("Cyto", 2, um, 1) + PM = Compartment("PM", 1, um, 3) + cc = CompartmentContainer() + cc.add([Cyto, PM]) + + # Create mesh + if not lagrange: + xrad = 1.0 * np.sqrt(aspect_ratios[i]) + yrad = 1.0 / np.sqrt(aspect_ratios[i]) + ellipse_mesh, mf1, mf2 = mesh_tools.create_ellipses( + xrad, + yrad, + hEdge=h_ellipse, + hInnerEdge=h_ellipse, + outer_tag=surf_tag, + outer_marker=edge_tag, + ) + mesh_folder = parent_folder / f"ellipse_mesh_AR{aspect_ratios[i]}" + mesh_folder.mkdir(exist_ok=True) + else: + mesh_folder = parent_folder / "ellipse_mesh_AR1" + + mesh_refinements = [0, 1, 2, 3, 4, 5, 6] + for j in range(len(mesh_refinements)): + mesh_file = mesh_folder / f"ellipse_mesh_{mesh_refinements[j]}.h5" + if not lagrange: + if mesh_refinements[j] > 0: + d.parameters["refinement_algorithm"] = "plaza_with_parent_facets" + ellipse_mesh = d.adapt(ellipse_mesh) + mf2 = d.adapt(mf2, ellipse_mesh) + mf1 = d.adapt(mf1, ellipse_mesh) + mesh_tools.write_mesh(ellipse_mesh, mf1, mf2, mesh_file) + + parent_mesh = mesh.ParentMesh( + mesh_filename=str(mesh_file), + mesh_filetype="hdf5", + name="parent_mesh", + ) + # init model + model_cur = model.Model(pc, sc, cc, rc, config_cur, parent_mesh) + model_cur.initialize() + results = dict() + result_folder = ( + parent_folder + / f"resultsEllipse_AR{aspect_ratios[i]}_lagrange{lagrange}_{mesh_refinements[j]}" + ) + result_folder.mkdir(exist_ok=True) + for species_name, species in model_cur.sc.items: + results[species_name] = d.XDMFFile( + model_cur.mpi_comm_world, str(result_folder / f"{species_name}.xdmf") + ) + results[species_name].parameters["flush_output"] = True + results[species_name].write(model_cur.sc[species_name].u["u"], model_cur.t) + if lagrange: + u1file = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / "u1var.xdmf")) + u1file.parameters["flush_output"] = True + u1file.write(cc["Cyto"].deform_func, model_cur.t) + udef = cc["Cyto"].deform_func + Fcur = d.Identity(3) + d.grad(udef) + Jcur = d.det(Fcur) + else: + Jcur = d.Constant(1.0) + avg_A = [A.initial_condition] + dx = d.Measure("dx", domain=model_cur.cc["Cyto"].dolfin_mesh) + volume = d.assemble_mixed(Jcur * dx) + while True: + # Solve the system + model_cur.monolithic_solve() + # Save results for post processing + for species_name, species in model_cur.sc.items: + results[species_name].write(model_cur.sc[species_name].u["u"], model_cur.t) + if lagrange: + u1file.write(cc["Cyto"].deform_func, model_cur.t) + int_val = d.assemble_mixed(Jcur * model_cur.sc["A"].u["u"] * dx) + avg_A.append(int_val / volume) + # End if we've passed the final time + if model_cur.t >= model_cur.final_t: + break + + np.savetxt(str(result_folder / "avg_A.txt"), avg_A) + Avecs.append(avg_A) + + if lagrange: + plt.plot( + model_cur.tvec, + avg_A, + linestyle="dashed", + label=f"Aspect ratio = {aspect_ratios[i]}, Lagrange", + ) + lagrangeSS.append(model_cur.sc["A"].sol.copy()) + udefs.append(udef) + else: + plt.plot(model_cur.tvec, avg_A, label=f"Aspect ratio = {aspect_ratios[i]}") + refSS.append(model_cur.sc["A"].sol.copy()) + + refFcn = refSS[-1] # use the most refined reference (eulerian) mesh + Vcur = refFcn.function_space() + coords = Vcur.tabulate_dof_coordinates() + dx = d.Measure("dx", domain=Vcur.mesh()) + l2_lagrangeCur = [] + l2_refCur = [] + for k in range(len(refSS) - 1): + lagrange_fun = d.Function(Vcur) + lagrange_vec = lagrange_fun.vector().get_local() + eul_fun = d.Function(Vcur) + eul_vec = eul_fun.vector().get_local() + + refSS[k].set_allow_extrapolation(True) + Lmesh = lagrangeSS[k].function_space().mesh() + d.ALE.move(Lmesh, udefs[k]) + Lmesh.bounding_box_tree().build(Lmesh) + lagrangeSS[k].set_allow_extrapolation(True) + for idx in range(len(lagrange_vec)): + cur_coord = coords[idx] + eul_vec[idx] = refSS[k](cur_coord) + lagrange_vec[idx] = lagrangeSS[k](cur_coord) + eul_fun.vector().set_local(eul_vec) + eul_fun.vector().apply("insert") + lagrange_fun.vector().set_local(lagrange_vec) + lagrange_fun.vector().apply("insert") + l2_lagrangeCur.append(np.sqrt(d.assemble((lagrange_fun - refFcn) ** 2 * dx))) + l2_refCur.append(np.sqrt(d.assemble((eul_fun - refFcn) ** 2 * dx))) + + np.savetxt(str(parent_folder / f"l2_lagrange_AR{aspect_ratios[i]}.txt"), l2_lagrangeCur) + np.savetxt(str(parent_folder / f"l2_eul_AR{aspect_ratios[i]}.txt"), l2_refCur) + +plt.legend() +plt.show() diff --git a/examples/example2/example2_withadvection.ipynb b/examples/example2/example2_withadvection.ipynb index f0f47d9..1944777 100644 --- a/examples/example2/example2_withadvection.ipynb +++ b/examples/example2/example2_withadvection.ipynb @@ -137,8 +137,12 @@ "# Compartments\n", "# =============================================================================================\n", "# name, topological dimensionality, length scale units, marker value\n", - "Cyto = Compartment(\"Cyto\", 2, um, 1, vel=(\"-0.1*y*(1 - (x**2+y**2))\",\"0.1*x*(1 - (x**2+y**2))\",\"0\"))\n", - "PM = Compartment(\"PM\", 1, um, 3)\n", + "# Cyto = Compartment(\"Cyto\", 2, um, 1, vel=(\"-0.1*y*(1 - (x**2+y**2))\",\"0.1*x*(1 - (x**2+y**2))\",\"0\"))\n", + "# Cyto = Compartment(\"Cyto\", 2, um, 1, deform=(\"-0.1*y*t*(1 - (x**2+y**2))\",\"0.1*x*t*(1 - (x**2+y**2))\",\"0\"), manual_update=True)\n", + "Cyto = Compartment(\"Cyto\", 2, um, 1, deform=(\"((1+sign(t-10))/2)*0.005*(t-10)*x/(1-0.005*(t-10))\",\n", + " \"-((1+sign(t-10))/2)*0.005*(t-10)*y\",\"0\")) # dilation\n", + "PM = Compartment(\"PM\", 1, um, 3, deform=(\"((1+sign(t-10))/2)*0.005*(t-10)*x/(1-0.005*(t-10))\",\n", + " \"-((1+sign(t-10))/2)*0.005*(t-10)*y\",\"0\"))\n", "cc = CompartmentContainer()\n", "cc.add([Cyto, PM])\n", "\n", @@ -146,9 +150,10 @@ "# Species\n", "# =============================================================================================\n", "# name, initial concentration, concentration units, diffusion, diffusion units, compartment\n", - "A = Species(\"A\", \"10*exp(-(x**2+(y-0.8)**2)/0.2**2)\", surf_unit, 0.001, D_unit, \"Cyto\")\n", - "X = Species(\"X\", 1.0, edge_unit, 1.0, D_unit, \"PM\")\n", - "B = Species(\"B\", 0.0, edge_unit, 1.0, D_unit, \"PM\")\n", + "# A = Species(\"A\", \"10*exp(-(x**2+(y-0.8)**2)/0.2**2)\", surf_unit, 0.001, D_unit, \"Cyto\")\n", + "A = Species(\"A\", 1.0, surf_unit, 0.001, D_unit, \"Cyto\")\n", + "X = Species(\"X\", 1.0, edge_unit, 0.001, D_unit, \"PM\")\n", + "B = Species(\"B\", 0.0, edge_unit, 0.001, D_unit, \"PM\")\n", "sc = SpeciesContainer()\n", "sc.add([A, X, B])\n", "\n", @@ -157,7 +162,7 @@ "# =============================================================================================\n", "\n", "# Reaction of A and X to make B (Cyto-PM reaction)\n", - "kon = Parameter(\"kon\", 0.0, 1/(surf_unit*sec))\n", + "kon = Parameter(\"kon\", 1.0, 1/(surf_unit*sec))\n", "koff = Parameter(\"koff\", 1.0, 1/sec)\n", "r1 = Reaction(\"r1\", [\"A\", \"X\"], [\"B\"],\n", " param_map={\"on\": \"kon\", \"off\": \"koff\"},\n", @@ -193,7 +198,7 @@ "yrad = 1.0\n", "surf_tag = 1\n", "edge_tag = 3\n", - "ellipse_mesh, mf1, mf2 = mesh_tools.create_ellipses(xrad, yrad, hEdge=h_ellipse,\n", + "ellipse_mesh, mf1, mf2 = mesh_tools.create_ellipses(2*xrad, 0.5*yrad, hEdge=h_ellipse,\n", " outer_tag=surf_tag, outer_marker=edge_tag)\n", "visualization.plot_dolfin_mesh(ellipse_mesh, mf2, view_xy=True)" ] @@ -249,8 +254,8 @@ "config_cur = config.Config()\n", "config_cur.solver.update(\n", " {\n", - " \"final_t\": 10.0,\n", - " \"initial_dt\": 0.05,\n", + " \"final_t\": 130.0,\n", + " \"initial_dt\": 1.0,\n", " \"time_precision\": 6,\n", " }\n", ")\n", @@ -279,7 +284,7 @@ "source": [ "model_cur.to_pickle('model_cur.pkl')\n", "results = dict()\n", - "result_folder = pathlib.Path(\"resultsEllipse_AR1_withLagrangeRecalc\")\n", + "result_folder = pathlib.Path(\"resultsEllipse_testShapeChange\")\n", "result_folder.mkdir(exist_ok=True)\n", "for species_name, species in model_cur.sc.items:\n", " results[species_name] = d.XDMFFile(\n", @@ -288,20 +293,22 @@ " results[species_name].parameters[\"flush_output\"] = True\n", " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", "\n", - "# save deformation field as well\n", - "V_vector = sc[\"A\"].compartment.vel_func.function_space()\n", - "V = d.FunctionSpace(cc[\"Cyto\"].dolfin_mesh, \"P\", 1)\n", - "velfile = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"vel.xdmf\"))\n", - "velfile.parameters[\"flush_output\"] = True\n", - "velfile.write(sc[\"A\"].compartment.vel_func, model_cur.t)\n", - "udef = d.Function(V_vector)\n", - "# uexpr = d.Expression(('-0.1*t*x[1]*(1 - (pow(x[0],2)+pow(x[1],2)))', \n", - "# '0.1*t*x[0]*(1 - (pow(x[0],2)+pow(x[1],2)))', '0'),\n", - "# degree=1, t=tval)\n", - "# uvar = d.interpolate(uexpr, V_vector)\n", - "ufile = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"uvar.xdmf\"))\n", - "ufile.parameters[\"flush_output\"] = True\n", - "ufile.write(udef, model_cur.t)" + "# save deformation or velocity field as well\n", + "if cc[\"Cyto\"].vel_logic:\n", + " velfile = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"vel.xdmf\"))\n", + " velfile.parameters[\"flush_output\"] = True\n", + " velfile.write(sc[\"A\"].compartment.vel_func, model_cur.t)\n", + "elif cc[\"Cyto\"].deform_logic:\n", + " u1file = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"u1var.xdmf\"))\n", + " u1file.parameters[\"flush_output\"] = True\n", + " u1file.write(cc[\"Cyto\"].deform_func, model_cur.t)\n", + " u2file = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"u2var.xdmf\"))\n", + " u2file.parameters[\"flush_output\"] = True\n", + " u2file.write(cc[\"PM\"].deform_func, model_cur.t)\n", + " # v1file = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"v1.xdmf\"))\n", + " # v1file.parameters[\"flush_output\"] = True\n", + " # v2file = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"v2.xdmf\"))\n", + " # v2file.parameters[\"flush_output\"] = True" ] }, { @@ -332,27 +339,17 @@ "avg_B = [d.assemble_mixed(B.u[\"u\"]*dx_PM) / PM_SA]\n", "# Set loglevel to warning in order not to pollute notebook output\n", "logger.setLevel(logging.WARNING)\n", - "# variables for lagrangian mapping\n", - "linear_wrt_comp = {k: True for k in model_cur.cc.keys}\n", "x = d.SpatialCoordinate(sc[\"A\"].compartment.dolfin_mesh)\n", - "xcur = x[0]\n", - "ycur = x[1]\n", - "u = sc[\"A\"]._usplit[\"u\"]\n", - "un = sc[\"A\"]._usplit[\"n\"]\n", - "v = sc[\"A\"].v\n", - "dx = sc[\"A\"].compartment.mesh.dx\n", - "Dform_units = (\n", - " sc[\"A\"].diffusion_units\n", - " * sc[\"A\"].concentration_units\n", - " * sc[\"A\"].compartment.compartment_units ** (sc[\"A\"].compartment.dimensionality - 2)\n", - " )\n", - "mass_form_units = (\n", - " sc[\"A\"].concentration_units / unit.s\n", - " * sc[\"A\"].compartment.compartment_units**sc[\"A\"].compartment.dimensionality\n", - " )\n", - "D_constant = d.Constant(sc[\"A\"].D, name=f\"D_{species.name}\")\n", - "vel = sc[\"A\"].compartment.vel_func\n", - "I = d.Identity(3)\n", + "# if cc[\"Cyto\"].deform_logic:\n", + "# udef = cc[\"Cyto\"].deform_func\n", + "# udef_local = udef.copy()\n", + "# V_vector = udef.function_space()\n", + "# vel_expr = d.Expression((\"-0.1*x[1]*(1 - (pow(x[0],2)+pow(x[1],2)))\",\n", + "# \"0.1*x[0]*(1 - (pow(x[0],2)+pow(x[1],2)))\",\"0\"), degree=1)\n", + "# vel = d.interpolate(vel_expr, V_vector)\n", + " # v1file.write(vel, model_cur.t)\n", + " # vel_approx = d.project((udef - cc[\"Cyto\"].deform_prev) / model_cur.dT, V_vector)\n", + " # v2file.write(vel_approx, model_cur.t)\n", "\n", "while True:\n", " # Solve the system\n", @@ -364,76 +361,50 @@ " avg_X.append(d.assemble_mixed(X.u[\"u\"]*dx_PM) / PM_SA)\n", " avg_B.append(d.assemble_mixed(B.u[\"u\"]*dx_PM) / PM_SA)\n", " tvec.append(model_cur.t)\n", - " # save deformation\n", - " # tval.assign(model_cur.t)\n", - " # uvar.assign(d.interpolate(uexpr, V_vector))\n", - " # ufile.write(uvar, model_cur.t)\n", - " # update Lagrangian operators\n", - " udef.assign(udef + vel*d.Constant(model_cur.tvec[-1]-model_cur.tvec[-2]))\n", - " ufile.write(udef, model_cur.t)\n", - " xcur = x[0] + udef[0]\n", - " ycur = x[1] + udef[1]\n", - " vcur_x = d.project(-0.1*ycur*(1 - (xcur**2+ycur**2)), V_vector.sub(0).collapse())\n", - " vcur_y = d.project(0.1*xcur*(1 - (xcur**2+ycur**2)), V_vector.sub(1).collapse())\n", - " vel.vector()[V_vector.sub(0).dofmap().dofs()] = vcur_x.vector()\n", - " vel.vector()[V_vector.sub(1).dofmap().dofs()] = vcur_y.vector()\n", - " vel.vector().apply(\"insert\")\n", - " \n", - " velfile.write(vel, model_cur.t)\n", - " F = I + d.grad(udef)\n", - " J = d.det(F)\n", - " if model_cur.config.flags[\"axisymmetric_model\"]:\n", - " Dform = x[0]*D_constant * J * d.inner(d.dot(d.inv(F.T), d.grad(u)),d.dot(d.inv(F.T), d.grad(v)))*dx\n", - " else:\n", - " Dform = D_constant * J * d.inner(d.dot(d.inv(F.T), d.grad(u)),d.dot(d.inv(F.T), d.grad(v)))*dx\n", - " model_cur.forms[\"diffusion_A\"] = Form(\n", - " f\"diffusion_{sc['A'].name}\",\n", - " Dform,\n", - " sc[\"A\"],\n", - " \"diffusion\",\n", - " Dform_units,\n", - " True,\n", - " linear_wrt_comp,\n", - " )\n", - " if model_cur.config.flags[\"axisymmetric_model\"]:\n", - " Aform = J*x[0] * (u*v*d.inner(d.inv(F.T),d.grad(vel))*dx)\n", - " else:\n", - " Aform = J*u*v*d.inner(d.inv(F.T),d.grad(vel))*dx\n", - " model_cur.forms[\"advection_A\"] = Form(\n", - " f\"advection_A\",\n", - " Aform,\n", - " sc[\"A\"],\n", - " \"advection\",\n", - " mass_form_units,\n", - " True,\n", - " linear_wrt_comp,\n", - " )\n", - " if model_cur.config.flags[\"axisymmetric_model\"]:\n", - " Muform = J*x[0] * (u) * v / model_cur.dT * dx\n", - " Munform = J*x[0] * (-un) * v / model_cur.dT * dx\n", - " else:\n", - " Muform = J*(u) * v / model_cur.dT * dx\n", - " Munform = J*(-un) * v / model_cur.dT * dx\n", - " model_cur.forms[\"mass_u_A\"] = Form(\n", - " \"mass_u_A\",\n", - " Muform,\n", - " sc[\"A\"],\n", - " \"mass_u\",\n", - " mass_form_units,\n", - " True,\n", - " linear_wrt_comp,\n", - " )\n", - " model_cur.forms[\"mass_un_A\"] = Form(\n", - " f\"mass_un_A\",\n", - " Munform,\n", - " sc[\"A\"],\n", - " \"mass_un\",\n", - " mass_form_units,\n", - " True,\n", - " linear_wrt_comp,\n", - " )\n", - " model_cur.initialize_discrete_variational_problem_and_solver()\n", - " print(f\"Done with time {model_cur.t} s\")\n", + " # save deformation or velocity\n", + " if cc[\"Cyto\"].vel_logic:\n", + " velfile.write(sc[\"A\"].compartment.vel_func, model_cur.t)\n", + " elif cc[\"Cyto\"].deform_logic:\n", + " # cc[\"Cyto\"].deform_prev.assign(udef_local)\n", + " # udef.assign(udef_local + vel*d.Constant(model_cur.tvec[-1]-model_cur.tvec[-2]))\n", + " u1file.write(cc[\"Cyto\"].deform_func, model_cur.t)\n", + " u2file.write(cc[\"PM\"].deform_func, model_cur.t)\n", + " # multCur = d.project(model_cur.fc[\"r1 [X (f)]\"].integral_factor,X.V)\n", + " # if np.any(np.isnan(multCur.vector()[:])):\n", + " # udef = cc[\"Cyto\"].deform_func\n", + " # Fcur = d.Identity(3) + d.grad(udef)\n", + " # Jcur = d.det(Fcur)\n", + " # Nexpr = d.Expression((\"x[0]/R\", \"x[1]/R\", \"0.0\"), degree=1, R=1)\n", + " # test_factor = Jcur*d.sqrt(d.inner(d.dot(Nexpr,d.inv(Fcur)),d.dot(Nexpr,d.inv(Fcur))))\n", + " # Vcur = d.VectorFunctionSpace(X.compartment.dolfin_mesh, \"P\", 1)\n", + " # N = d.interpolate(Nexpr, Vcur)\n", + " # N = self.surface.normals\n", + " \n", + " # for name, flux in model_cur.fc.items:\n", + " # if \"r1\" in name:\n", + " # Vcur = flux.integral_factor.function_space()\n", + " # not_assigned = True\n", + " # while not_assigned:\n", + " # try:\n", + " # flux.integral_factor.assign(d.project(test_factor, Vcur))\n", + " # not_assigned = False\n", + " # except:\n", + " # print('Try again!')\n", + " # multfile.write(model_cur.fc[\"r1 [X (f)]\"].integral_factor, model_cur.t)\n", + " # udef_local = udef.copy()\n", + " # # compute new velocities\n", + " # xcur = x[0] + udef[0]\n", + " # ycur = x[1] + udef[1]\n", + " # vcur_x = d.project(-0.1*ycur*(1 - (xcur**2+ycur**2)), V_vector.sub(0).collapse())\n", + " # vcur_y = d.project(0.1*xcur*(1 - (xcur**2+ycur**2)), V_vector.sub(1).collapse())\n", + " # vel.vector()[V_vector.sub(0).dofmap().dofs()] = vcur_x.vector()\n", + " # vel.vector()[V_vector.sub(1).dofmap().dofs()] = vcur_y.vector()\n", + " # vel.vector().apply(\"insert\")\n", + " # v1file.write(vel, model_cur.t)\n", + " # vel_approx.assign(d.project((udef - cc[\"Cyto\"].deform_prev) / model_cur.dT, V_vector))\n", + " # v2file.write(vel_approx, model_cur.t)\n", + "\n", + " print(f\"Done with t={model_cur.t}\")\n", " # End if we've passed the final time\n", " if model_cur.t >= model_cur.final_t:\n", " break" @@ -471,23 +442,11 @@ "ss_pred = root_vals[root_vals > 0]\n", "plt.plot(tvec, np.ones(len(avg_A))*ss_pred, '--', label='Steady-state analytical prediction')\n", "plt.legend()\n", - "percent_error_analytical = 100*np.abs(ss_pred-avg_A[-1])/ss_pred\n", - "assert percent_error_analytical < 0.1,\\\n", - " f\"Failed test: Example 2 results deviate {percent_error_analytical:.3f}% from the analytical prediction\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ffae481c", - "metadata": {}, - "outputs": [], - "source": [ - "from cowpy import cow\n", - "if True:#percent_error_analytical > 0.1:\n", - " stegy = cow.Stegosaurus(thoughts=True)\n", - " stegy_msg = stegy.milk(\"Failed test: Example 2 results deviate from the analytical prediction\")\n", - " print(stegy_msg)" + "# from cowpy import cow\n", + "# if True:#percent_error_analytical > 0.1:\n", + "# stegy = cow.Stegosaurus(thoughts=True)\n", + "# stegy_msg = stegy.milk(\"Failed test: Example 2 results deviate from the analytical prediction\")\n", + "# print(stegy_msg)" ] }, { @@ -502,16 +461,11 @@ { "cell_type": "code", "execution_count": null, - "id": "d950b475", + "id": "ffae481c", "metadata": {}, "outputs": [], "source": [ - "visualization.plot(model_cur.sc[\"A\"].u[\"u\"], view_xy=True)\n", - "# also save to file for comparison visualization in the end\n", - "meshimg_folder = pathlib.Path(\"mesh_images\")\n", - "meshimg_folder = meshimg_folder.resolve()\n", - "meshimg_folder.mkdir(exist_ok=True)\n", - "meshimg_file = meshimg_folder / \"ellipse_mesh_AR1.png\"" + "visualization.plot(model_cur.sc[\"A\"].u[\"u\"], view_xy=True)" ] } ], diff --git a/smart/model.py b/smart/model.py index 6e8246b..5e36a9a 100644 --- a/smart/model.py +++ b/smart/model.py @@ -1037,23 +1037,80 @@ def _init_4_7_set_initial_conditions(self): vec.apply("insert") for compartment in self._active_compartments: # if vel is string, generate expr for advection - if compartment.vel != 0: + compartment.vel_logic = np.any([vel != 0.0 for vel in compartment.vel]) + compartment.deform_logic = np.any([deform != 0.0 for deform in compartment.deform]) + if compartment.vel_logic and compartment.deform_logic: + raise ValueError("Cannot prescribe both velocity and deformation") + elif compartment.vel_logic: x, y, z = (sym.Symbol(f"x[{i}]") for i in range(3)) vel_expr = [None] * len(compartment.vel) # then this needs to have free symbols inserted for i in range(len(compartment.vel)): - vel_str = compartment.vel[i] - # Parse the given string to create a sympy expression - sym_expr = parse_expr(vel_str).subs({"x": x, "y": y, "z": z, "t": self.t}) - free_symbols = [str(x) for x in sym_expr.free_symbols] - if not {"x[0]", "x[1]", "x[2]"}.issuperset(free_symbols): - # could add other keywords for spatial dependence in the future - raise NotImplementedError + if isinstance(compartment.vel[i], float): + vel_expr[i] = f"{compartment.vel[i]}" + elif isinstance(compartment.vel[i], str): + vel_str = compartment.vel[i] + # Parse the given string to create a sympy expression + sym_expr = parse_expr(vel_str).subs({"x": x, "y": y, "z": z}) + free_symbols = [str(x) for x in sym_expr.free_symbols] + if not {"x[0]", "x[1]", "x[2]", "t"}.issuperset(free_symbols): + # could add other keywords for spatial dependence in the future + raise NotImplementedError + else: + vel_expr[i] = sym.printing.ccode(sym_expr) else: - vel_expr[i] = sym.printing.ccode(sym_expr) - compartment.vel_expr = d.Expression(vel_expr, degree=1) + raise NotImplementedError("Velocity must be float or string") + compartment.vel_expr = d.Expression(vel_expr, degree=1, t=self.T) V_vector = d.VectorFunctionSpace(compartment.dolfin_mesh, "P", 1) compartment.vel_func = d.interpolate(compartment.vel_expr, V_vector) + elif compartment.deform_logic: + x, y, z = (sym.Symbol(f"x[{i}]") for i in range(3)) + deform_expr = [None] * len(compartment.deform) + # then this needs to have free symbols inserted + for i in range(len(compartment.deform)): + if isinstance(compartment.deform[i], float): + deform_expr[i] = f"{compartment.deform[i]}" + elif isinstance(compartment.deform[i], str): + deform_str = compartment.deform[i] + # Parse the given string to create a sympy expression + sym_expr = parse_expr(deform_str).subs({"x": x, "y": y, "z": z}) + free_symbols = [str(x) for x in sym_expr.free_symbols] + if not {"x[0]", "x[1]", "x[2]", "t"}.issuperset(free_symbols): + # could add other keywords for spatial dependence in the future + raise NotImplementedError + else: + deform_expr[i] = sym.printing.ccode(sym_expr) + else: + raise NotImplementedError("Deformation must be float or string") + compartment.deform_expr = d.Expression(deform_expr, degree=1, t=self.T) + V_vector = d.VectorFunctionSpace(compartment.dolfin_mesh, "P", 1) + compartment.deform_func = d.interpolate(compartment.deform_expr, V_vector) + compartment.deform_prev = d.interpolate(compartment.deform_expr, V_vector) + if not compartment.is_volume: # then is a surface and must compute normals + mesh_ref = compartment.mesh.parent_mesh.dolfin_mesh + ref_normals = d.FacetNormal(mesh_ref) + Vcur = d.VectorFunctionSpace(mesh_ref, "P", 1) + ucur = d.TrialFunction(Vcur) + vcur = d.TestFunction(Vcur) + ds = d.Measure("ds", mesh_ref) + a = d.inner(ucur, vcur) * ds + lform = d.inner(ref_normals, vcur) * ds + A = d.assemble(a, keep_diagonal=True) + L = d.assemble(lform) + A.ident_zeros() + nh = d.Function(Vcur) + d.solve(A, nh.vector(), L) # project facet normals onto CG1 + Vbound = d.VectorFunctionSpace(compartment.mesh.dolfin_mesh, "P", 1) + norm_calc = d.interpolate(nh, Vbound) + nvec = norm_calc.vector()[:] + # normalize magnitudes for consistency (unit normal) + for i in range(int(len(nvec) / 3)): + vec_cur = nvec[3 * i : 3 * (i + 1)] + mag_cur = np.sqrt(vec_cur[0] ** 2 + vec_cur[1] ** 2 + vec_cur[2] ** 2) + nvec[3 * i : 3 * (i + 1)] = vec_cur / mag_cur + norm_calc.vector().set_local(nvec) + norm_calc.vector().apply("insert") + compartment.normals = norm_calc def _init_5_1_reactions_to_fluxes(self): """Convert reactions to flux objects""" @@ -1121,6 +1178,16 @@ def _init_5_2_create_variational_forms(self): / unit.s * species.compartment.compartment_units**species.compartment.dimensionality ) + lagrange = species.compartment.deform_logic + # define current jacobian + if lagrange: + udef = species.compartment.deform_func + F = d.Identity(3) + d.grad(udef) + J = d.det(F) + else: + J = d.Constant(1.0) + if self.config.flags["axisymmetric_model"]: + J = x[0] * J # diffusion term if species.D == 0: logger.debug( @@ -1129,29 +1196,15 @@ def _init_5_2_create_variational_forms(self): extra=dict(format_type="log"), ) else: - lagrange = True - if lagrange and species.compartment.vel != 0: # then nonzero advection + if lagrange: # then nonzero advection # alt Lagrangian form D_constant = d.Constant(D, name=f"D_{species.name}") - vel = species.compartment.vel_func - udef = vel * d.Constant(self.t - self.tvec[0]) - F = d.Identity(3) + d.grad(udef) - J = d.det(F) - if self.config.flags["axisymmetric_model"]: - Dform = ( - x[0] - * D_constant - * J - * d.inner(d.dot(d.inv(F.T), d.grad(u)), d.dot(d.inv(F.T), d.grad(v))) - * dx - ) - else: - Dform = ( - D_constant - * J - * d.inner(d.dot(d.inv(F.T), d.grad(u)), d.dot(d.inv(F.T), d.grad(v))) - * dx - ) + Dform = ( + D_constant + * J + * d.inner(d.dot(d.inv(F.T), d.grad(u)), d.dot(d.inv(F.T), d.grad(v))) + * dx + ) self.forms.add( Form( f"diffusion_{species.name}", @@ -1165,10 +1218,7 @@ def _init_5_2_create_variational_forms(self): ) else: D_constant = d.Constant(D, name=f"D_{species.name}") - if self.config.flags["axisymmetric_model"]: - Dform = x[0] * D_constant * d.inner(d.grad(u), d.grad(v)) * dx - else: - Dform = D_constant * d.inner(d.grad(u), d.grad(v)) * dx + Dform = J * D_constant * d.inner(d.grad(u), d.grad(v)) * dx # exponent is -2 because of two gradients self.forms.add( @@ -1182,19 +1232,24 @@ def _init_5_2_create_variational_forms(self): linear_wrt_comp, ) ) - - if species.compartment.vel != 0: # then nonzero advection + if lagrange: # account for volume changes due to advection + vel_approx = (udef - species.compartment.deform_prev) / self.dT + Aform = J * u * v * d.inner(d.inv(F.T), d.grad(vel_approx)) * dx + # Aform = J * u * v * d.inner(vel, d.dot(d.inv(F.T), d.grad(u))) * dx + self.forms.add( + Form( + f"advection_{species.name}", + Aform, + species, + "advection", + mass_form_units, + True, + linear_wrt_comp, + ) + ) + elif species.compartment.vel_logic: # then nonzero advection vel = species.compartment.vel_func - if lagrange: - if self.config.flags["axisymmetric_model"]: - Aform = J * x[0] * (u * v * d.inner(d.inv(F), d.grad(vel)) * dx) - else: - Aform = J * u * v * d.inner(d.inv(F), d.grad(vel)) * dx - else: - if self.config.flags["axisymmetric_model"]: - Aform = x[0] * (u * v * d.div(vel) * dx + d.inner(v * vel, d.grad(u))) - else: - Aform = u * v * d.div(vel) * dx + d.inner(v * vel, d.grad(u)) * dx + Aform = J * u * v * d.div(vel) * dx + d.inner(v * vel, d.grad(u)) * dx self.forms.add( Form( f"advection_{species.name}", @@ -1208,10 +1263,7 @@ def _init_5_2_create_variational_forms(self): ) # mass (time derivative) terms - if self.config.flags["axisymmetric_model"]: - Muform = x[0] * (u) * v / self.dT * dx - else: - Muform = (u) * v / self.dT * dx + Muform = J * u * v / self.dT * dx self.forms.add( Form( f"mass_u_{species.name}", @@ -1223,10 +1275,7 @@ def _init_5_2_create_variational_forms(self): linear_wrt_comp, ) ) - if self.config.flags["axisymmetric_model"]: - Munform = x[0] * (-un) * v / self.dT * dx - else: - Munform = (-un) * v / self.dT * dx + Munform = J * (-un) * v / self.dT * dx self.forms.add( Form( f"mass_un_{species.name}", @@ -1933,6 +1982,16 @@ def update_time_dependent_parameters(self): dt = float(self.dt) tn = float(self.tn) + # Update velocity or deformation if applicable + for compartment in self._active_compartments: + if compartment.vel_logic and not compartment.manual_update: + Vcur = compartment.vel_func.function_space() + compartment.vel_func.assign(d.interpolate(compartment.vel_expr, Vcur)) + elif compartment.deform_logic and not compartment.manual_update: + Vcur = compartment.deform_func.function_space() + compartment.deform_prev.assign(compartment.deform_func.copy()) + compartment.deform_func.assign(d.interpolate(compartment.deform_expr, Vcur)) + # Update time dependent parameters for parameter_name, parameter in self.pc.items: new_value = None diff --git a/smart/model_assembly.py b/smart/model_assembly.py index 7b40ac5..0c59f1f 100644 --- a/smart/model_assembly.py +++ b/smart/model_assembly.py @@ -1135,14 +1135,19 @@ class Compartment(ObjectInstance): dimensionality: topological dimensionality (e.g. 3 for volume, 2 for surface) compartment_units: length units for the compartment cell_marker: marker value identifying the compartment in the parent mesh - vel: string expression for advective velocity field within compartment + vel: string expressions for advective velocity field within compartment + deform: string expressions for deformation field within compartment """ name: str dimensionality: int compartment_units: pint.Unit cell_marker: Any - vel: Union[str, float] = 0.0 + # vel: Union[list[str], list[float]] = [0.0, 0.0, 0.0] + # deform: Union[list[str], list[float]] = [0.0, 0.0, 0.0] + vel: list = dataclass.field(default_factory=lambda: [0.0, 0.0, 0.0]) + deform: list = dataclass.field(default_factory=lambda: [0.0, 0.0, 0.0]) + manual_update: bool = False def to_dict(self): "Convert to a dict that can be used to recreate the object." @@ -1174,6 +1179,10 @@ def __post_init__(self): self.v = None self.vel_expr = None self.vel_func = None + self.deform_expr = None + self.deform_func = None + self.vel_logic = False + self.deform_logic = False def check_validity(self): """ @@ -1747,9 +1756,9 @@ def _post_init_get_integration_measure(self): "volume-surface_to_volume", ]: # intersection of this surface with boundary of source volume(s) - logger.debug( - "DEBUGGING INTEGRATION MEASURE (only fully defined domains are enabled for now)" - ) + # logger.debug( + # "DEBUGGING INTEGRATION MEASURE (only fully defined domains are enabled for now)" + # ) self.measure = self.surface.mesh.dx self.measure_units = self.surface.compartment_units**self.surface.dimensionality @@ -1787,7 +1796,6 @@ def equation_lambda_eval(self, input_type="quantity"): return unit_to_quantity(self._equation_quantity.units) # Seems like setting this as a @property doesn't cause fenics to recompile - @property def form(self): """-1 factor because terms are defined as if they were on the @@ -1806,10 +1814,72 @@ def form(self): mult = u_mask_new else: mult = d.Constant(-1.0, name="-1") + + # alphaExpr = d.Expression("1.0", degree=1) + # Vcur = d.FunctionSpace(self.surface.mesh.dolfin_mesh, "P", 1) + # self.integral_factor = d.interpolate(alphaExpr, Vcur) + # self.integral_factor = alphaExpr + + if self.topology in ["volume", "surface"]: + if self.destination_compartment.deform_logic: + udef = self.destination_compartment.deform_func + Fcur = d.Identity(3) + d.grad(udef) + Jcur = d.det(Fcur) + if self.topology == "surface": + # Nexpr = d.Expression(("x[0]/R", "x[1]/R", "0.0"), degree=1, R=1) + # Vcur = d.VectorFunctionSpace(self.surface.mesh.dolfin_mesh, "P", 1) + # N = d.interpolate(Nexpr, Vcur) + N = self.surface.normals + self.integral_factor = Jcur * d.sqrt( + d.inner(d.dot(N, d.inv(Fcur)), d.dot(N, d.inv(Fcur))) + ) + else: # then volume + self.integral_factor = Jcur + # mult *= Jcur + else: + self.integral_factor = d.Expression("1.0", degree=1) + elif self.topology in [ + "volume_to_surface", + "surface_to_volume", + "volume-volume_to_surface", + "volume-surface_to_volume", + ]: + source_list = list(self.source_compartments.values()) + if ( + self.destination_compartment.deform_logic + and np.all([source.deform_logic for source in source_list]) + and self.surface.deform_logic + ): + # if (self.topology == "volume_to_surface" or + # self.topology == "volume-volume_to_surface"): + # vol_ref = source_list[0] + # else: + # vol_ref = self.destination_compartment + udef = self.surface.deform_func + Fcur = d.Identity(3) + d.grad(udef) + Jcur = d.det(Fcur) + # Nexpr = d.Expression(("x[0]/R", "x[1]/R", "0.0"), degree=1, R=1) + # Vcur = d.VectorFunctionSpace(self.surface.mesh.dolfin_mesh, "P", 1) + # N = d.interpolate(Nexpr, Vcur) + N = self.surface.normals + self.integral_factor = Jcur * d.sqrt( + d.inner(d.dot(N, d.inv(Fcur)), d.dot(N, d.inv(Fcur))) + ) + # mult *= self.integral_factor + elif ( + self.destination_compartment.deform_logic + or np.any([source.deform_logic for source in source_list]) + or self.surface.deform_logic + ): + raise ValueError("Deformation must be continuous across interface") + else: + self.integral_factor = d.Expression("1.0", degree=1) + if self.axisymm: return ( mult * x[0] + * self.integral_factor * self.equation_lambda_eval(input_type="value") * self.destination_species.v * self.measure @@ -1817,6 +1887,7 @@ def form(self): else: return ( mult + * self.integral_factor * self.equation_lambda_eval(input_type="value") * self.destination_species.v * self.measure From 9c95a2f936281811dd1ef9f5caadeb6b52ac07d5 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:22:24 -0700 Subject: [PATCH 11/25] Introduce new example to test advection feature, add functionality to multicellular meshing function for tutorial --- examples/example5/example5_withSOCE.ipynb | 27 +- examples/example5/test_data.h5 | Bin 224520 -> 0 bytes examples/example5/test_data.xdmf | 143 ----------- examples/example7/example7.ipynb | 34 ++- examples/example8/example8.ipynb | 299 ++++++++++++++++++++++ smart/mesh_tools.py | 128 ++++++--- smart/model.py | 20 +- smart/model_assembly.py | 7 +- smart/solvers.py | 9 +- smart/test_mesh.ipynb | 36 +++ 10 files changed, 505 insertions(+), 198 deletions(-) delete mode 100644 examples/example5/test_data.h5 delete mode 100644 examples/example5/test_data.xdmf create mode 100644 examples/example8/example8.ipynb create mode 100644 smart/test_mesh.ipynb diff --git a/examples/example5/example5_withSOCE.ipynb b/examples/example5/example5_withSOCE.ipynb index c70075b..532d0a1 100644 --- a/examples/example5/example5_withSOCE.ipynb +++ b/examples/example5/example5_withSOCE.ipynb @@ -278,7 +278,10 @@ "AER = Species(\"AER\", 200.0, vol_unit, 5.0, D_unit, \"ER\")\n", "# Uniform initial condition of R for simplicity\n", "R1 = Species(\"R1\", 1.0, surf_unit, 0.02, D_unit, \"ERm\")\n", - "R1o = Species(\"R1o\", 0.0, surf_unit, 0.02, D_unit, \"ERm\")" + "R1o = Species(\"R1o\", 0.0, surf_unit, 0.02, D_unit, \"ERm\")\n", + "\n", + "# Add a species to represent Orai1\n", + "Orai1_open = Species(\"Orai1_open\", 0.0, surf_unit, 0.0, D_unit, \"PM\")" ] }, { @@ -298,7 +301,7 @@ "outputs": [], "source": [ "sc = SpeciesContainer()\n", - "sc.add([R1o, R1, AER, B, A])" + "sc.add([R1o, R1, AER, B, A, Orai1_open])" ] }, { @@ -425,8 +428,20 @@ "source": [ "PSOCE = Parameter.mesh_quantity(\"PSOCE\", 0, unit.dimensionless, compartment=\"PM\")\n", "J0_SOCE = Parameter(\"J0_SOCE\", 1e4, flux_unit)\n", - "rSOCE = Reaction(\n", - " \"rSOCE\",\n", + "\n", + "tauSOCE = Parameter(\"tauSOCE\", 1.0, sec)\n", + "rhoTot = Parameter(\"rhoTot\", 1.0, surf_unit)\n", + "rSOCEOpen = Reaction(\n", + " \"rSOCEOpen\",\n", + " [],\n", + " [\"Orai1_open\"],\n", + " param_map={\"P\": \"PSOCE\", \"rhoTot\": \"rhoTot\", \"tauSOCE\": \"tauSOCE\"},\n", + " eqn_f_str=\"(rhoTot*P - Orai1_open)/tauSOCE\",\n", + " explicit_restriction_to_domain=\"PM\",\n", + ")\n", + "\n", + "rSOCEFlux = Reaction(\n", + " \"rSOCEFlux\",\n", " [],\n", " [\"A\"],\n", " param_map={\"P\": \"PSOCE\", \"J0\": \"J0_SOCE\"},\n", @@ -453,8 +468,8 @@ "source": [ "pc = ParameterContainer()\n", "rc = ReactionContainer()\n", - "pc.add([k4Vmax, k3r, k3f, k2f, j1pulse, PSOCE, J0_SOCE])\n", - "rc.add([r1, r2, r3, r4, rSOCE])" + "pc.add([k4Vmax, k3r, k3f, k2f, j1pulse, PSOCE, J0_SOCE, tauSOCE, rhoTot])\n", + "rc.add([r1, r2, r3, r4, rSOCEFlux, rSOCEOpen])" ] }, { diff --git a/examples/example5/test_data.h5 b/examples/example5/test_data.h5 deleted file mode 100644 index 8b18d271effe73edebca35f621eee05f199c51a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224520 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 - - - - - - - test_data.h5:/Mesh/0/mesh/topology - - - test_data.h5:/Mesh/0/mesh/geometry - - - - - test_data.h5:/Mesh/1/mesh/topology - - - test_data.h5:/Mesh/1/mesh/geometry - - - - - test_data.h5:/Mesh/2/mesh/topology - - - test_data.h5:/Mesh/2/mesh/geometry - - - - - test_data.h5:/Mesh/3/mesh/topology - - - test_data.h5:/Mesh/3/mesh/geometry - - - - - test_data.h5:/Mesh/4/mesh/topology - - - test_data.h5:/Mesh/4/mesh/geometry - - - - - test_data.h5:/Mesh/5/mesh/topology - - - test_data.h5:/Mesh/5/mesh/geometry - - - - - test_data.h5:/Mesh/6/mesh/topology - - - test_data.h5:/Mesh/6/mesh/geometry - - - - - test_data.h5:/Mesh/7/mesh/topology - - - test_data.h5:/Mesh/7/mesh/geometry - - - - - test_data.h5:/Mesh/8/mesh/topology - - - test_data.h5:/Mesh/8/mesh/geometry - - - - - test_data.h5:/Mesh/9/mesh/topology - - - test_data.h5:/Mesh/9/mesh/geometry - - - - - test_data.h5:/Mesh/10/mesh/topology - - - test_data.h5:/Mesh/10/mesh/geometry - - - - - diff --git a/examples/example7/example7.ipynb b/examples/example7/example7.ipynb index 2c86caa..a667dd0 100644 --- a/examples/example7/example7.ipynb +++ b/examples/example7/example7.ipynb @@ -252,6 +252,29 @@ " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", "model_cur.to_pickle(\"model_cur.pkl\")\n", "\n", + "locVec2 = [[-30,-30,-30], [-30,30,-30], [-30,-30,30], [-30,30,30], \n", + " [30,-30,-30], [30,30,-30], [30,-30,30], [30,30,30]]\n", + "cell_id_fcn = d.MeshFunction(\"size_t\", cc[\"PM2\"].dolfin_mesh, 2, 0)\n", + "for c in d.cells(cc[\"PM2\"].dolfin_mesh):\n", + " xCur = c.midpoint().x()\n", + " yCur = c.midpoint().y()\n", + " zCur = c.midpoint().z()\n", + " for i in range(len(locVec2)):\n", + " print(f\"Checking cell {i+1}, facet {c.index()}\")\n", + " Rcur = np.sqrt((locVec2[i][0]-xCur)**2 + \n", + " (locVec2[i][1]-yCur)**2 +\n", + " (locVec2[i][2]-zCur)**2)\n", + " if Rcur < 11.0:\n", + " cell_id_fcn[c] = i+1\n", + "dx_PM2 = d.Measure(\"dx\", domain=cc[\"PM2\"].dolfin_mesh, subdomain_data=cell_id_fcn)\n", + "avg_concs = []\n", + "avg_conc_cur = []\n", + "sas = []\n", + "for i in range(len(locVec2)):\n", + " sas.append(d.assemble_mixed(1.0*dx_PM2(i+1)))\n", + " avg_conc_cur.append(d.assemble_mixed(sc[\"G\"].sol*dx_PM2(i+1))/sas[-1])\n", + "avg_concs.append(avg_conc_cur)\n", + "\n", "# Set loglevel to warning in order not to pollute notebook output\n", "logger.setLevel(logging.WARNING)\n", "# Solve\n", @@ -263,10 +286,19 @@ " # Save results for post processing\n", " for species_name, species in model_cur.sc.items:\n", " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + " avg_conc_cur = []\n", + " for i in range(len(locVec2)):\n", + " avg_conc_cur.append(d.assemble_mixed(sc[\"G\"].sol*dx_PM2(i+1))/sas[i])\n", + " avg_concs.append(avg_conc_cur)\n", " print(f\"Done with t={model_cur.t}\")\n", " # End if we've passed the final time\n", " if model_cur.t >= model_cur.final_t:\n", - " break" + " break\n", + "\n", + "np.savetxt(\"test_data.txt\", avg_concs)\n", + "for i in range(len(locVec2)):\n", + " plt.plot(model_cur.tvec, np.array(avg_concs)[:,i])\n", + "# plt.plot(model_cur.tvec,)" ] } ], diff --git a/examples/example8/example8.ipynb b/examples/example8/example8.ipynb new file mode 100644 index 0000000..47ddbca --- /dev/null +++ b/examples/example8/example8.ipynb @@ -0,0 +1,299 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f65f18d7", + "metadata": {}, + "source": [ + "# Example 7: Advection-diffusion in a cylindrical geometry\n", + "\n", + "Here, we consider release of a molecule from a cylindrical wall with Pouiselle flow." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc398816", + "metadata": {}, + "outputs": [], + "source": [ + "import dolfin as d\n", + "import sympy as sym\n", + "import numpy as np\n", + "import pathlib\n", + "import logging\n", + "import gmsh # must be imported before pyvista if dolfin is imported first\n", + "\n", + "from smart import config, mesh, model, mesh_tools, visualization\n", + "from smart.units import unit\n", + "from smart.model_assembly import (\n", + " Compartment,\n", + " Parameter,\n", + " Reaction,\n", + " Species,\n", + " SpeciesContainer,\n", + " ParameterContainer,\n", + " CompartmentContainer,\n", + " ReactionContainer,\n", + ")\n", + "\n", + "from matplotlib import pyplot as plt\n", + "import matplotlib.image as mpimg\n", + "from matplotlib import rcParams\n", + "\n", + "logger = logging.getLogger(\"smart\")\n", + "logger.setLevel(logging.INFO)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "95b9d865", + "metadata": {}, + "source": [ + "We define the relevant units here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f4023cf", + "metadata": {}, + "outputs": [], + "source": [ + "# Aliases - base units\n", + "uM = unit.uM\n", + "um = unit.um\n", + "molecule = unit.molecule\n", + "sec = unit.sec\n", + "dimensionless = unit.dimensionless\n", + "# Aliases - units used in model\n", + "D_unit = um**2 / sec\n", + "flux_unit = uM * um / sec\n", + "vol_unit = uM\n", + "surf_unit = molecule / um**2" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "46582d26", + "metadata": {}, + "source": [ + "## Model generation\n", + "\n", + "We define the compartments and species first, with their respective containers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02a000f2", + "metadata": {}, + "outputs": [], + "source": [ + "Cyto = Compartment(\"Cyto\", 3, um, 1)\n", + "PM = Compartment(\"PM\", 2, um, 10,\n", + " vel=[\"0\",\"0\",\"100.0*[1-(x[0]**2 + x[1]**2//4)]\"])\n", + "\n", + "cc = CompartmentContainer()\n", + "cc.add([Cyto, PM])\n", + "\n", + "A = Species(\"A\", \"1+0.1*z\", vol_unit, 1.0, D_unit, \"Cyto\")\n", + "sc = SpeciesContainer()\n", + "sc.add([A])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3c56e840", + "metadata": {}, + "source": [ + "Define parameters and reactions, then place in respective containers.\n", + "* r1: release of A from PM" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e1f6882", + "metadata": {}, + "outputs": [], + "source": [ + "# flux to keep constant \n", + "Awall = Parameter.from_expression(\"Awall\", \"1 + 0.1*z\", vol_unit)\n", + "Jwall = Parameter(\"Jwall\", 1000, flux_unit / vol_unit)\n", + "r1 = Reaction(\n", + " \"r1\",\n", + " [],\n", + " [\"A\"],\n", + " param_map={\"Awall\": \"Awall\", \"Jwall\": \"Jwall\"},\n", + " eqn_f_str=\"Jwall*(Awall-A)\",\n", + " explicit_restriction_to_domain=\"PM\",\n", + ")\n", + "\n", + "pc = ParameterContainer()\n", + "pc.add([Awall, Jwall])\n", + "rc = ReactionContainer()\n", + "rc.add([r1])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "15c35d39", + "metadata": {}, + "source": [ + "## Create and load in mesh\n", + "\n", + "Here, we consider cells embedded in a cube mesh. The source cell is located at (0,0,0) and 8 other cells are spread equidistant through the mesh." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe56e162", + "metadata": {}, + "outputs": [], + "source": [ + "domain, facet_markers, cell_markers = mesh_tools.create_cylinders(outerRad = 2.0, innerRad=0, outerLength=10.0, innerLength=0,\n", + " hEdge=0.5)\n", + "# Write mesh and meshfunctions to file\n", + "mesh_folder = pathlib.Path(\"mesh\")\n", + "mesh_folder.mkdir(exist_ok=True)\n", + "mesh_path = mesh_folder / \"cyl_mesh.h5\"\n", + "mesh_tools.write_mesh(\n", + " domain, facet_markers, cell_markers, filename=mesh_path\n", + ")\n", + "parent_mesh = mesh.ParentMesh(\n", + " mesh_filename=str(mesh_path),\n", + " mesh_filetype=\"hdf5\",\n", + " name=\"parent_mesh\",\n", + ")\n", + "visualization.plot_dolfin_mesh(domain, cell_markers, facet_markers)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "0943588e", + "metadata": {}, + "source": [ + "Initialize model and solver." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac88bdec", + "metadata": {}, + "outputs": [], + "source": [ + "config_cur = config.Config()\n", + "config_cur.flags.update({\"allow_unused_components\": True})\n", + "model_cur = model.Model(pc, sc, cc, rc, config_cur, parent_mesh)\n", + "config_cur.solver.update(\n", + " {\n", + " \"final_t\": 100.0,\n", + " \"initial_dt\": 0.01,\n", + " \"time_precision\": 8,\n", + " \"reset_timestep_for_negative_solution\": True,\n", + " }\n", + ")\n", + "model_cur.initialize()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5d5aacbd", + "metadata": {}, + "source": [ + "Initialize XDMF files for saving results, save model information to .pkl file, then solve the system until `model_cur.t > model_cur.final_t`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b54d28ca", + "metadata": {}, + "outputs": [], + "source": [ + "# Write initial condition(s) to file\n", + "results = dict()\n", + "result_folder = pathlib.Path(f\"results\")\n", + "result_folder.mkdir(exist_ok=True)\n", + "for species_name, species in model_cur.sc.items:\n", + " results[species_name] = d.XDMFFile(\n", + " model_cur.mpi_comm_world, str(result_folder / f\"{species_name}.xdmf\")\n", + " )\n", + " results[species_name].parameters[\"flush_output\"] = True\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + "model_cur.to_pickle(\"model_cur.pkl\")\n", + "\n", + "# Set loglevel to warning in order not to pollute notebook output\n", + "logger.setLevel(logging.WARNING)\n", + "# Solve\n", + "displayed = False\n", + "while True:\n", + " # Solve the system\n", + " model_cur.monolithic_solve()\n", + " model_cur.adjust_dt()\n", + " # Save results for post processing\n", + " for species_name, species in model_cur.sc.items:\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + "\n", + " print(f\"Done with t={model_cur.t}\")\n", + " # End if we've passed the final time\n", + " if model_cur.t >= model_cur.final_t:\n", + " break\n", + "\n", + "# plt.plot(model_cur.tvec,)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b755f19b", + "metadata": {}, + "outputs": [], + "source": [ + "u = sc[\"A\"].sol\n", + "udiff = u - d.Expression(\"1.0+0.1*x[2]\")" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "vscode": { + "interpreter": { + "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/smart/mesh_tools.py b/smart/mesh_tools.py index 4ffabef..4c71afd 100644 --- a/smart/mesh_tools.py +++ b/smart/mesh_tools.py @@ -738,15 +738,22 @@ def create_multicell( ) -> Tuple[d.Mesh, d.MeshFunction, d.MeshFunction]: """ Creates a mesh with an outer cube containing embedded cells at specified locations. + Cells can be of two types, type 1 and type 2 throughout. Args: cubeSize: Length of cube sides - locVec: vector of cell locations + locVec1: list of cell 1 locations (each list element is a list [x,y,z]) + locVec2: list of cell 2 locations (each list element is a list [x,y,z]) + cellRad1: either a float, a list of floats, or a list of lists, each + containing a list of three floats for each axis [rx,ry,rz] + cellRad2: either a float, a list of floats, or a list of lists, each + containing a list of three floats for each axis [rx,ry,rz] hCube: maximum mesh size for cube - hCell: maximum mesh size for cell surfaces - interface_marker: The value to mark facets on the interface with - outer_marker: The value to mark facets on the outer ellipsoid with - inner_vol_tag: The value to mark the inner spherical volume with - outer_vol_tag: The value to mark the outer spherical volume with + hCell: maximum mesh size for cell surface + interface_marker1: The value to mark facets on cell 1 surface + outer_marker: The value to mark facets on the surface of the cube + extracell_tag: Tag for extracellular volume + cell_vol_tag1: Tag for the volume of type 1 cells + outer_vol_tag2: Tag for the volume of type 2 cells comm: MPI communicator to create the mesh with verbose: If true print gmsh output, else skip Returns: @@ -758,11 +765,7 @@ def create_multicell( ValueError("Outer cube size is equal to zero") if np.isclose(hCube, 0): hCube = 0.1 * max(cubeSize) - if np.isclose(hCell, 0): - hCell = 0.2 * cubeSize if np.isclose(cellRad1, 0) else 0.2 * cellRad1 - # if innerRad > outerRad or innerLength >= outerLength: - # ValueError("Inner cylinder does not fit inside outer cylinder") - # Create the two cylinder mesh using gmsh + gmsh.initialize() gmsh.option.setNumber("General.Terminal", int(verbose)) @@ -771,9 +774,9 @@ def create_multicell( cube = gmsh.model.occ.addBox( -cubeSize / 2, -cubeSize / 2, -cubeSize / 2, cubeSize, cubeSize, cubeSize ) - if (np.isclose(cellRad1, 0) or len(locVec1) == 0) and ( - np.isclose(cellRad2, 0) or len(locVec2) == 0 - ): + meanRad1 = 0 + meanRad2 = 0 + if (len(locVec1) == 0) and (len(locVec2) == 0): # Just a cube! gmsh.model.occ.synchronize() gmsh.model.add_physical_group(3, [cube], tag=extracell_tag) @@ -782,18 +785,63 @@ def create_multicell( else: # Add cells cell_list = [] + cellRad1Vec = [] + cellRad2Vec = [] # first add source cell(s) for i in range(len(locVec1)): - cur_tag = gmsh.model.occ.addSphere( - locVec1[i][0], locVec1[i][1], locVec1[i][2], cellRad1 - ) + if isinstance(cellRad1, float) or isinstance(cellRad1, int): + cellRadCur = float(cellRad1) + elif len(locVec1) == 1 and len(cellRad1) == 3: + cellRadCur = cellRad1 + elif len(cellRad1) == len(locVec1): + cellRadCur = cellRad1[i] + else: + raise ValueError("Radii must be floats or lists of 3 floats") + if isinstance(cellRadCur, float): + cellRads = [cellRadCur, cellRadCur, cellRadCur] + if len(cellRadCur) == 3: + cellRads = cellRadCur + else: + raise ValueError("Radii must be floats or lists of 3 floats") + + cur_tag = gmsh.model.occ.addSphere(locVec1[i][0], locVec1[i][1], locVec1[i][2], 1.0) + gmsh.model.occ.dilate([(3, cur_tag)], 0, 0, 0, cellRads[0], cellRads[1], cellRads[2]) cell_list.append((3, cur_tag)) + meanRad1 += np.mean(cellRads) + cellRad1Vec.append(cellRads) + if meanRad1 > 0: + meanRad1 /= len(locVec1) # now add additional cells for i in range(len(locVec2)): - cur_tag = gmsh.model.occ.addSphere( - locVec2[i][0], locVec2[i][1], locVec2[i][2], cellRad2 - ) + if isinstance(cellRad2, float) or isinstance(cellRad2, int): + cellRadCur = float(cellRad2) + elif len(locVec2) == 1 and len(cellRad2) == 3: + cellRadCur = cellRad2 + elif len(cellRad2) == len(locVec2): + cellRadCur = cellRad2[i] + else: + raise ValueError("Radii must be floats or lists of 3 floats") + if isinstance(cellRadCur, float): + cellRads = [cellRadCur, cellRadCur, cellRadCur] + if len(cellRadCur) == 3: + cellRads = cellRadCur + else: + raise ValueError("Radii must be floats or lists of 3 floats") + + cur_tag = gmsh.model.occ.addSphere(locVec2[i][0], locVec2[i][1], locVec2[i][2], 1.0) + gmsh.model.occ.dilate([(3, cur_tag)], 0, 0, 0, cellRads[0], cellRads[1], cellRads[2]) cell_list.append((3, cur_tag)) + meanRad2 = np.mean(cellRads) + cellRad2Vec.append(cellRads) + if meanRad2 > 0: + meanRad2 /= len(locVec2) + # define hCell if it was previously set to zero + if np.isclose(hCell, 0): + hCell = ( + 0.2 * cubeSize + if (meanRad1 == 0 and meanRad2 == 0) + else 0.2 * max([meanRad1, meanRad2]) + ) # Create interface between cells and extracell full_geo, maps = gmsh.model.occ.fragment([(3, cube)], cell_list) cube_map = maps[0] @@ -818,7 +866,7 @@ def create_multicell( 2, [faces[0][1] for faces in inner_shells2], tag=interface_marker2 ) - # Physical markers for + # Physical markers for all volumes all_volumes = [tag[1] for tag in cube_map] inner_volumes1 = [tag[0][1] for tag in cell_maps[0 : len(locVec1)]] inner_volumes2 = [tag[0][1] for tag in cell_maps[len(locVec1) :]] @@ -839,44 +887,42 @@ def meshSizeCallback(dim, tag, x, y, z, lc): # if innerRad=0, then the mesh length is interpolated between # hEdge at the PM and 0.2*outerRad in the center - if (np.isclose(cellRad1, 0) or len(locVec1) == 0) and ( - np.isclose(cellRad2, 0) or len(locVec2) == 0 - ): + if len(locVec1) == 0 and len(locVec2) == 0: return hCube - elif np.isclose(cellRad1, 0) or len(locVec1) == 0: + elif len(locVec1) == 0: cell_locs1 = [np.inf] cell_locs2 = np.sqrt( - (x - np.array(locVec2)[:, 0]) ** 2 - + (y - np.array(locVec2)[:, 1]) ** 2 - + (z - np.array(locVec2)[:, 2]) ** 2 + ((x - np.array(locVec2)[:, 0]) / np.array(cellRad2Vec)[:, 0]) ** 2 + + ((y - np.array(locVec2)[:, 1]) / np.array(cellRad2Vec)[:, 1]) ** 2 + + ((z - np.array(locVec2)[:, 2]) / np.array(cellRad2Vec)[:, 2]) ** 2 ) - elif np.isclose(cellRad2, 0) or len(locVec2) == 0: + elif len(locVec2) == 0: cell_locs1 = np.sqrt( - (x - np.array(locVec1)[:, 0]) ** 2 - + (y - np.array(locVec1)[:, 1]) ** 2 - + (z - np.array(locVec1)[:, 2]) ** 2 + ((x - np.array(locVec1)[:, 0]) / np.array(cellRad1Vec)[:, 0]) ** 2 + + ((y - np.array(locVec1)[:, 1]) / np.array(cellRad1Vec)[:, 1]) ** 2 + + ((z - np.array(locVec1)[:, 2]) / np.array(cellRad1Vec)[:, 2]) ** 2 ) cell_locs2 = [np.inf] else: cell_locs1 = np.sqrt( - (x - np.array(locVec1)[:, 0]) ** 2 - + (y - np.array(locVec1)[:, 1]) ** 2 - + (z - np.array(locVec1)[:, 2]) ** 2 + ((x - np.array(locVec1)[:, 0]) / cellRad1Vec[:, 0]) ** 2 + + ((y - np.array(locVec1)[:, 1]) / cellRad1Vec[:, 1]) ** 2 + + ((z - np.array(locVec1)[:, 2]) / cellRad1Vec[:, 2]) ** 2 ) cell_locs2 = np.sqrt( - (x - np.array(locVec2)[:, 0]) ** 2 - + (y - np.array(locVec2)[:, 1]) ** 2 - + (z - np.array(locVec2)[:, 2]) ** 2 + ((x - np.array(locVec2)[:, 0]) / cellRad2Vec[:, 0]) ** 2 + + ((y - np.array(locVec2)[:, 1]) / cellRad2Vec[:, 1]) ** 2 + + ((z - np.array(locVec2)[:, 2]) / cellRad2Vec[:, 2]) ** 2 ) closest_cell1 = min(cell_locs1) closest_cell2 = min(cell_locs2) - if (closest_cell1 < cellRad1) or (closest_cell2 < cellRad2): + if (closest_cell1 < 1.0) or (closest_cell2 < 1.0): return hCell else: if closest_cell1 < closest_cell2: - cellWeight = np.exp(-(closest_cell1 - cellRad1) / (0.2 * cellRad1)) + cellWeight = np.exp(-(closest_cell1 - 1.0) / 0.1) else: - cellWeight = np.exp(-(closest_cell2 - cellRad2) / (0.2 * cellRad2)) + cellWeight = np.exp(-(closest_cell2 - 1.0) / 0.1) return hCell * cellWeight + hCube * (1 - cellWeight) gmsh.model.mesh.setSizeCallback(meshSizeCallback) diff --git a/smart/model.py b/smart/model.py index 0a960b5..82c2c9a 100644 --- a/smart/model.py +++ b/smart/model.py @@ -1098,7 +1098,21 @@ def _init_4_7_set_initial_conditions(self): compartment.deform_func = d.interpolate(compartment.deform_expr, V_vector) compartment.deform_prev = d.interpolate(compartment.deform_expr, V_vector) if not compartment.is_volume: # then is a surface and must compute normals - mesh_ref = compartment.mesh.parent_mesh.dolfin_mesh + surf_coords = compartment.dolfin_mesh.coordinates() + for c in self.cc: # find an adjacent volume! + if c.is_volume: + mesh_test = c.dolfin_mesh + test_coords = mesh_test.coordinates() + adjacent = True + for i in range(len(surf_coords)): + if surf_coords[i] not in test_coords: + adjacent = False + break + if adjacent: + mesh_ref = mesh_test + break + if not adjacent: + raise ValueError("Could not find an adjacent volume to compute normals!") ref_normals = d.FacetNormal(mesh_ref) Vcur = d.VectorFunctionSpace(mesh_ref, "P", 1) ucur = d.TrialFunction(Vcur) @@ -1260,7 +1274,7 @@ def _init_5_2_create_variational_forms(self): ) elif species.compartment.vel_logic: # then nonzero advection vel = species.compartment.vel_func - Aform = J * u * v * d.div(vel) * dx + d.inner(v * vel, d.grad(u)) * dx + Aform = J * u * v * d.div(vel) * dx + J * d.inner(v * vel, d.grad(u)) * dx self.forms.add( Form( f"advection_{species.name}", @@ -2000,7 +2014,7 @@ def update_time_dependent_parameters(self): compartment.vel_func.assign(d.interpolate(compartment.vel_expr, Vcur)) elif compartment.deform_logic and not compartment.manual_update: Vcur = compartment.deform_func.function_space() - compartment.deform_prev.assign(compartment.deform_func.copy()) + compartment.deform_prev.assign(compartment.deform_func.copy(deepcopy=True)) compartment.deform_func.assign(d.interpolate(compartment.deform_expr, Vcur)) # Update time dependent parameters diff --git a/smart/model_assembly.py b/smart/model_assembly.py index 03bafdf..2181ef2 100644 --- a/smart/model_assembly.py +++ b/smart/model_assembly.py @@ -1179,8 +1179,8 @@ class Compartment(ObjectInstance): cell_marker: Any # vel: Union[list[str], list[float]] = [0.0, 0.0, 0.0] # deform: Union[list[str], list[float]] = [0.0, 0.0, 0.0] - vel: list = dataclass.field(default_factory=lambda: [0.0, 0.0, 0.0]) - deform: list = dataclass.field(default_factory=lambda: [0.0, 0.0, 0.0]) + vel: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) + deform: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) manual_update: bool = False def to_dict(self): @@ -1905,7 +1905,8 @@ def form(self): or np.any([source.deform_logic for source in source_list]) or self.surface.deform_logic ): - raise ValueError("Deformation must be continuous across interface") + logger.warning("FIX: Ensure that deformation must be continuous across interface") + self.integral_factor = d.Expression("1.0", degree=1) else: self.integral_factor = d.Expression("1.0", degree=1) diff --git a/smart/solvers.py b/smart/solvers.py index b3b9e24..1bd6727 100644 --- a/smart/solvers.py +++ b/smart/solvers.py @@ -9,6 +9,8 @@ from .common import Stopwatch from .model_assembly import Compartment +import numpy as np + logger = logging.getLogger(__name__) __all__ = ["smartSNESProblem"] @@ -356,7 +358,12 @@ def assemble_Fnest(self, Fnest): extra=dict(format_type="log"), ) continue - Fvecs[j].append(d.as_backend_type(d.assemble_mixed(form))) + # Fvecs[j].append(d.as_backend_type(d.assemble_mixed(form))) + # assemble_mixed sometimes returns nan (nondeterministic???) + cur_vec = d.assemble_mixed(self.Fforms[j][k]) + while any(np.isnan(cur_vec.get_local())): + cur_vec = d.assemble_mixed(self.Fforms[j][k]) + Fvecs[j].append(d.as_backend_type(cur_vec)) Fj_petsc[j].zeroEntries() for k, vec in enumerate(Fvecs[j]): Fj_petsc[j].axpy(1, vec.vec()) diff --git a/smart/test_mesh.ipynb b/smart/test_mesh.ipynb new file mode 100644 index 0000000..30d5f4c --- /dev/null +++ b/smart/test_mesh.ipynb @@ -0,0 +1,36 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "9baf2f11", + "metadata": {}, + "outputs": [], + "source": [ + "from smart import mesh_tools\n", + "mesh_tools.create_nested_box_with_nanopillars()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 9dd5a758ed1198b1325dff11da627acdfa881afd Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:25:36 -0700 Subject: [PATCH 12/25] Add back data files for example5 --- examples/example5/test_data.h5 | Bin 0 -> 224520 bytes examples/example5/test_data.xdmf | 143 +++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 examples/example5/test_data.h5 create mode 100644 examples/example5/test_data.xdmf diff --git a/examples/example5/test_data.h5 b/examples/example5/test_data.h5 new file mode 100644 index 0000000000000000000000000000000000000000..8b18d271effe73edebca35f621eee05f199c51a3 GIT binary patch literal 224520 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 + + + + + + + test_data.h5:/Mesh/0/mesh/topology + + + test_data.h5:/Mesh/0/mesh/geometry + + + + + test_data.h5:/Mesh/1/mesh/topology + + + test_data.h5:/Mesh/1/mesh/geometry + + + + + test_data.h5:/Mesh/2/mesh/topology + + + test_data.h5:/Mesh/2/mesh/geometry + + + + + test_data.h5:/Mesh/3/mesh/topology + + + test_data.h5:/Mesh/3/mesh/geometry + + + + + test_data.h5:/Mesh/4/mesh/topology + + + test_data.h5:/Mesh/4/mesh/geometry + + + + + test_data.h5:/Mesh/5/mesh/topology + + + test_data.h5:/Mesh/5/mesh/geometry + + + + + test_data.h5:/Mesh/6/mesh/topology + + + test_data.h5:/Mesh/6/mesh/geometry + + + + + test_data.h5:/Mesh/7/mesh/topology + + + test_data.h5:/Mesh/7/mesh/geometry + + + + + test_data.h5:/Mesh/8/mesh/topology + + + test_data.h5:/Mesh/8/mesh/geometry + + + + + test_data.h5:/Mesh/9/mesh/topology + + + test_data.h5:/Mesh/9/mesh/geometry + + + + + test_data.h5:/Mesh/10/mesh/topology + + + test_data.h5:/Mesh/10/mesh/geometry + + + + + From b166fb4fbdf5319b0926d42cf1763ecea41cc4cf Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:27:30 -0700 Subject: [PATCH 13/25] Remove mesh test file --- smart/test_mesh.ipynb | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 smart/test_mesh.ipynb diff --git a/smart/test_mesh.ipynb b/smart/test_mesh.ipynb deleted file mode 100644 index 30d5f4c..0000000 --- a/smart/test_mesh.ipynb +++ /dev/null @@ -1,36 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "9baf2f11", - "metadata": {}, - "outputs": [], - "source": [ - "from smart import mesh_tools\n", - "mesh_tools.create_nested_box_with_nanopillars()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From f48b001ebcd29c4edc3c7d5b35ac4dda8c3d4200 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:19:40 -0700 Subject: [PATCH 14/25] Bump version to gamma --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e444256..6ff7197 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.0.0", "wheel"] [project] name = "fenics-smart" -version = "2.3.0.beta.1" +version = "2.3.0.gamma" description = "Spatial Modeling Algorithms for Reactions and Transport (SMART) is a high-performance finite-element-based simulation package for model specification and numerical simulation of spatially-varying reaction-transport processes in biological cells." authors = [{ name = "Justin Laughlin", email = "justinglaughlin@gmail.com" }] license = { file = "LICENSE" } From e60d813cfc5460d15c11b6b0663d16e557781f73 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:22:07 -0700 Subject: [PATCH 15/25] Remove nan loop in solver --- smart/solvers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/smart/solvers.py b/smart/solvers.py index 1bd6727..40bca3c 100644 --- a/smart/solvers.py +++ b/smart/solvers.py @@ -9,7 +9,7 @@ from .common import Stopwatch from .model_assembly import Compartment -import numpy as np +# import numpy as np logger = logging.getLogger(__name__) @@ -361,8 +361,8 @@ def assemble_Fnest(self, Fnest): # Fvecs[j].append(d.as_backend_type(d.assemble_mixed(form))) # assemble_mixed sometimes returns nan (nondeterministic???) cur_vec = d.assemble_mixed(self.Fforms[j][k]) - while any(np.isnan(cur_vec.get_local())): - cur_vec = d.assemble_mixed(self.Fforms[j][k]) + # while any(np.isnan(cur_vec.get_local())): + # cur_vec = d.assemble_mixed(self.Fforms[j][k]) Fvecs[j].append(d.as_backend_type(cur_vec)) Fj_petsc[j].zeroEntries() for k, vec in enumerate(Fvecs[j]): From af81db224355dab07c29da1b249619edd2593b35 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:28:39 -0700 Subject: [PATCH 16/25] change version to 2.3.1.alpha --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6ff7197..ca2b855 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.0.0", "wheel"] [project] name = "fenics-smart" -version = "2.3.0.gamma" +version = "2.3.1.alpha" description = "Spatial Modeling Algorithms for Reactions and Transport (SMART) is a high-performance finite-element-based simulation package for model specification and numerical simulation of spatially-varying reaction-transport processes in biological cells." authors = [{ name = "Justin Laughlin", email = "justinglaughlin@gmail.com" }] license = { file = "LICENSE" } From 17cb903f112e44148f46011d4c1e9f5a038e161f Mon Sep 17 00:00:00 2001 From: emmetfrancis Date: Wed, 6 Aug 2025 00:16:27 -0700 Subject: [PATCH 17/25] fix to multicell meshing function, add back nan fix with protection against infinite loop --- examples/example5/example5_withSOCE.ipynb | 3 ++- pyproject.toml | 2 +- smart/mesh_tools.py | 32 +++++++++++++++++------ smart/solvers.py | 8 +++--- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/examples/example5/example5_withSOCE.ipynb b/examples/example5/example5_withSOCE.ipynb index 532d0a1..198c844 100644 --- a/examples/example5/example5_withSOCE.ipynb +++ b/examples/example5/example5_withSOCE.ipynb @@ -521,7 +521,8 @@ " and (ymin - d.DOLFIN_EPS < cell.midpoint().y() < ymax + d.DOLFIN_EPS)\n", " and (zmin - d.DOLFIN_EPS < cell.midpoint().z() < zmax + d.DOLFIN_EPS)\n", " )\n", - "domain, facet_markers, cell_markers = mesh_tools.create_cubes(condition=cur_cube_condition, N=20)\n", + "# domain, facet_markers, cell_markers = mesh_tools.create_cubes(condition=cur_cube_condition, N=20)\n", + "domain, facet_markers, cell_markers = mesh_tools.create_nested_substrate(hEdge=5.0)\n", "visualization.plot_dolfin_mesh(domain, cell_markers, clip_plane=(1,\n", " 1, 0), clip_origin=(0.5, 0.5, 0.5))\n" ] diff --git a/pyproject.toml b/pyproject.toml index ca2b855..4a5e39a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.0.0", "wheel"] [project] name = "fenics-smart" -version = "2.3.1.alpha" +version = "2.3.1.alpha.1" description = "Spatial Modeling Algorithms for Reactions and Transport (SMART) is a high-performance finite-element-based simulation package for model specification and numerical simulation of spatially-varying reaction-transport processes in biological cells." authors = [{ name = "Justin Laughlin", email = "justinglaughlin@gmail.com" }] license = { file = "LICENSE" } diff --git a/smart/mesh_tools.py b/smart/mesh_tools.py index 4c71afd..63fe61b 100644 --- a/smart/mesh_tools.py +++ b/smart/mesh_tools.py @@ -805,7 +805,15 @@ def create_multicell( raise ValueError("Radii must be floats or lists of 3 floats") cur_tag = gmsh.model.occ.addSphere(locVec1[i][0], locVec1[i][1], locVec1[i][2], 1.0) - gmsh.model.occ.dilate([(3, cur_tag)], 0, 0, 0, cellRads[0], cellRads[1], cellRads[2]) + gmsh.model.occ.dilate( + [(3, cur_tag)], + locVec1[i][0], + locVec1[i][1], + locVec1[i][2], + cellRads[0], + cellRads[1], + cellRads[2], + ) cell_list.append((3, cur_tag)) meanRad1 += np.mean(cellRads) cellRad1Vec.append(cellRads) @@ -829,7 +837,15 @@ def create_multicell( raise ValueError("Radii must be floats or lists of 3 floats") cur_tag = gmsh.model.occ.addSphere(locVec2[i][0], locVec2[i][1], locVec2[i][2], 1.0) - gmsh.model.occ.dilate([(3, cur_tag)], 0, 0, 0, cellRads[0], cellRads[1], cellRads[2]) + gmsh.model.occ.dilate( + [(3, cur_tag)], + locVec2[i][0], + locVec2[i][1], + locVec2[i][2], + cellRads[0], + cellRads[1], + cellRads[2], + ) cell_list.append((3, cur_tag)) meanRad2 = np.mean(cellRads) cellRad2Vec.append(cellRads) @@ -905,14 +921,14 @@ def meshSizeCallback(dim, tag, x, y, z, lc): cell_locs2 = [np.inf] else: cell_locs1 = np.sqrt( - ((x - np.array(locVec1)[:, 0]) / cellRad1Vec[:, 0]) ** 2 - + ((y - np.array(locVec1)[:, 1]) / cellRad1Vec[:, 1]) ** 2 - + ((z - np.array(locVec1)[:, 2]) / cellRad1Vec[:, 2]) ** 2 + ((x - np.array(locVec1)[:, 0]) / np.array(cellRad1Vec)[:, 0]) ** 2 + + ((y - np.array(locVec1)[:, 1]) / np.array(cellRad1Vec)[:, 1]) ** 2 + + ((z - np.array(locVec1)[:, 2]) / np.array(cellRad1Vec)[:, 2]) ** 2 ) cell_locs2 = np.sqrt( - ((x - np.array(locVec2)[:, 0]) / cellRad2Vec[:, 0]) ** 2 - + ((y - np.array(locVec2)[:, 1]) / cellRad2Vec[:, 1]) ** 2 - + ((z - np.array(locVec2)[:, 2]) / cellRad2Vec[:, 2]) ** 2 + ((x - np.array(locVec2)[:, 0]) / np.array(cellRad2Vec)[:, 0]) ** 2 + + ((y - np.array(locVec2)[:, 1]) / np.array(cellRad2Vec)[:, 1]) ** 2 + + ((z - np.array(locVec2)[:, 2]) / np.array(cellRad2Vec)[:, 2]) ** 2 ) closest_cell1 = min(cell_locs1) closest_cell2 = min(cell_locs2) diff --git a/smart/solvers.py b/smart/solvers.py index 40bca3c..e488160 100644 --- a/smart/solvers.py +++ b/smart/solvers.py @@ -9,7 +9,7 @@ from .common import Stopwatch from .model_assembly import Compartment -# import numpy as np +import numpy as np logger = logging.getLogger(__name__) @@ -361,8 +361,10 @@ def assemble_Fnest(self, Fnest): # Fvecs[j].append(d.as_backend_type(d.assemble_mixed(form))) # assemble_mixed sometimes returns nan (nondeterministic???) cur_vec = d.assemble_mixed(self.Fforms[j][k]) - # while any(np.isnan(cur_vec.get_local())): - # cur_vec = d.assemble_mixed(self.Fforms[j][k]) + count = 1 + while any(np.isnan(cur_vec.get_local())) and count < 10: + cur_vec = d.assemble_mixed(self.Fforms[j][k]) + count += 1 Fvecs[j].append(d.as_backend_type(cur_vec)) Fj_petsc[j].zeroEntries() for k, vec in enumerate(Fvecs[j]): From 4eb20f8266e8b1e3d71bc120e975a90717592d0f Mon Sep 17 00:00:00 2001 From: emmetfrancis Date: Thu, 14 Aug 2025 09:56:28 -0700 Subject: [PATCH 18/25] Change title of example 8 --- examples/example2/example2.ipynb | 46 +++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/examples/example2/example2.ipynb b/examples/example2/example2.ipynb index 5555dfa..6b72ef1 100644 --- a/examples/example2/example2.ipynb +++ b/examples/example2/example2.ipynb @@ -311,7 +311,7 @@ "avg_X = [X.initial_condition]\n", "avg_B = [B.initial_condition]\n", "# Set loglevel to warning in order not to pollute notebook output\n", - "logger.setLevel(logging.WARNING)\n", + "logger.setLevel(logging.DEBUG)\n", "\n", "while True:\n", " # Solve the system\n", @@ -333,6 +333,50 @@ " break" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "72884c41", + "metadata": {}, + "outputs": [], + "source": [ + "import petsc4py.PETSc as PETSc\n", + "Adof = model_cur.sc[\"A\"].dof_map\n", + "Avec = model_cur.sc[\"A\"].sol.vector()[Adof]\n", + "Bdof = model_cur.sc[\"B\"].dof_map\n", + "Bvec = model_cur.sc[\"B\"].sol.vector()[Bdof]\n", + "Xdof = model_cur.sc[\"X\"].dof_map\n", + "Xvec = model_cur.sc[\"X\"].sol.vector()[Xdof]\n", + "data_dict = dict()\n", + "data_dict[\"A\"] = Avec\n", + "data_dict[\"B\"] = Bvec\n", + "data_dict[\"X\"] = Xvec\n", + "\n", + "def weak_residual(model_cur, data_dict):\n", + " for s in model_cur.sc:\n", + " if s.name not in data_dict.keys():\n", + " raise ValueError(\"Must provide vector for all species\")\n", + " else:\n", + " cur_data = data_dict[s.name]\n", + " cur_vec = s.u[\"u\"].vector()\n", + " cur_dof = s.dof_map\n", + " cur_vec[cur_dof] = cur_data\n", + " s.u[\"u\"].vector().set_local(cur_vec)\n", + " s.u[\"u\"].vector().apply(\"insert\")\n", + " if len(model_cur.problem.global_sizes) == 1:\n", + " model_cur._ubackend = model_cur.u[\"u\"]._functions[0].vector().vec().copy()\n", + " else:\n", + " model_cur._ubackend = PETSc.Vec().createNest(\n", + " [usub.vector().vec().copy() for usub in model_cur.u[\"u\"]._functions],\n", + " comm=model_cur.mpi_comm_world,\n", + " )\n", + " return model_cur.solver.getFunctionNorm()\n", + "\n", + "print(f\"Residual is {weak_residual(model_cur, data_dict)}\")\n", + "data_dict[\"A\"] += 1.0\n", + "print(f\"Perturbed residual is {weak_residual(model_cur, data_dict)}\")" + ] + }, { "attachments": {}, "cell_type": "markdown", From baad40f02318d775a933cd9e5f530b0385a20031 Mon Sep 17 00:00:00 2001 From: emmetfrancis Date: Thu, 14 Aug 2025 10:00:22 -0700 Subject: [PATCH 19/25] Change title of example 8 --- examples/example2/example2.ipynb | 46 +------------------------------- examples/example8/example8.ipynb | 2 +- 2 files changed, 2 insertions(+), 46 deletions(-) diff --git a/examples/example2/example2.ipynb b/examples/example2/example2.ipynb index 6b72ef1..5555dfa 100644 --- a/examples/example2/example2.ipynb +++ b/examples/example2/example2.ipynb @@ -311,7 +311,7 @@ "avg_X = [X.initial_condition]\n", "avg_B = [B.initial_condition]\n", "# Set loglevel to warning in order not to pollute notebook output\n", - "logger.setLevel(logging.DEBUG)\n", + "logger.setLevel(logging.WARNING)\n", "\n", "while True:\n", " # Solve the system\n", @@ -333,50 +333,6 @@ " break" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "72884c41", - "metadata": {}, - "outputs": [], - "source": [ - "import petsc4py.PETSc as PETSc\n", - "Adof = model_cur.sc[\"A\"].dof_map\n", - "Avec = model_cur.sc[\"A\"].sol.vector()[Adof]\n", - "Bdof = model_cur.sc[\"B\"].dof_map\n", - "Bvec = model_cur.sc[\"B\"].sol.vector()[Bdof]\n", - "Xdof = model_cur.sc[\"X\"].dof_map\n", - "Xvec = model_cur.sc[\"X\"].sol.vector()[Xdof]\n", - "data_dict = dict()\n", - "data_dict[\"A\"] = Avec\n", - "data_dict[\"B\"] = Bvec\n", - "data_dict[\"X\"] = Xvec\n", - "\n", - "def weak_residual(model_cur, data_dict):\n", - " for s in model_cur.sc:\n", - " if s.name not in data_dict.keys():\n", - " raise ValueError(\"Must provide vector for all species\")\n", - " else:\n", - " cur_data = data_dict[s.name]\n", - " cur_vec = s.u[\"u\"].vector()\n", - " cur_dof = s.dof_map\n", - " cur_vec[cur_dof] = cur_data\n", - " s.u[\"u\"].vector().set_local(cur_vec)\n", - " s.u[\"u\"].vector().apply(\"insert\")\n", - " if len(model_cur.problem.global_sizes) == 1:\n", - " model_cur._ubackend = model_cur.u[\"u\"]._functions[0].vector().vec().copy()\n", - " else:\n", - " model_cur._ubackend = PETSc.Vec().createNest(\n", - " [usub.vector().vec().copy() for usub in model_cur.u[\"u\"]._functions],\n", - " comm=model_cur.mpi_comm_world,\n", - " )\n", - " return model_cur.solver.getFunctionNorm()\n", - "\n", - "print(f\"Residual is {weak_residual(model_cur, data_dict)}\")\n", - "data_dict[\"A\"] += 1.0\n", - "print(f\"Perturbed residual is {weak_residual(model_cur, data_dict)}\")" - ] - }, { "attachments": {}, "cell_type": "markdown", diff --git a/examples/example8/example8.ipynb b/examples/example8/example8.ipynb index 47ddbca..e1058fa 100644 --- a/examples/example8/example8.ipynb +++ b/examples/example8/example8.ipynb @@ -6,7 +6,7 @@ "id": "f65f18d7", "metadata": {}, "source": [ - "# Example 7: Advection-diffusion in a cylindrical geometry\n", + "# Example 8: Advection-diffusion in a cylindrical geometry\n", "\n", "Here, we consider release of a molecule from a cylindrical wall with Pouiselle flow." ] From 6bbcb1dcfb69f81379986c018421ca30fa1b74f3 Mon Sep 17 00:00:00 2001 From: emmetfrancis Date: Sun, 15 Feb 2026 22:16:32 -0800 Subject: [PATCH 20/25] Update version number --- examples/example2/example2.ipynb | 15 +- .../example2/example2_withadvection.ipynb | 69 ++-- pyproject.toml | 2 +- smart/mesh_tools.py | 6 +- smart/model.py | 319 ++++++++++++++---- smart/model_assembly.py | 69 ++-- 6 files changed, 364 insertions(+), 116 deletions(-) diff --git a/examples/example2/example2.ipynb b/examples/example2/example2.ipynb index 5555dfa..2f846a3 100644 --- a/examples/example2/example2.ipynb +++ b/examples/example2/example2.ipynb @@ -192,7 +192,7 @@ "yrad = 1.0\n", "surf_tag = 1\n", "edge_tag = 3\n", - "ellipse_mesh, mf1, mf2 = mesh_tools.create_ellipses(xrad, yrad, hEdge=h_ellipse,\n", + "ellipse_mesh, mf1, mf2 = mesh_tools.create_ellipses(xrad, yrad, hEdge=h_ellipse, hInnerEdge=h_ellipse,\n", " outer_tag=surf_tag, outer_marker=edge_tag)\n", "visualization.plot_dolfin_mesh(ellipse_mesh, mf2, view_xy=True)" ] @@ -316,13 +316,14 @@ "while True:\n", " # Solve the system\n", " model_cur.monolithic_solve()\n", + " print(model_cur.get_total_residual(2))\n", " # Save results for post processing\n", " for species_name, species in model_cur.sc.items:\n", " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", " dx = d.Measure(\"dx\", domain=model_cur.cc['Cyto'].dolfin_mesh)\n", " int_val = d.assemble_mixed(model_cur.sc['A'].u['u']*dx)\n", " volume = d.assemble_mixed(1.0*dx)\n", - " avg_A.append(int_val / volume)\n", + " avg_A.append(model_cur.sc[\"A\"].sol(0,0))#append(int_val / volume)\n", " avg_X.append(d.assemble_mixed(X.u[\"u\"]*d.Measure(\"dx\",PM.dolfin_mesh)) \n", " / (d.assemble_mixed(1.0*d.Measure(\"dx\",PM.dolfin_mesh))))\n", " avg_B.append(d.assemble_mixed(B.u[\"u\"]*d.Measure(\"dx\",PM.dolfin_mesh)) \n", @@ -333,6 +334,16 @@ " break" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "764b009e", + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(tvec, avg_A)" + ] + }, { "attachments": {}, "cell_type": "markdown", diff --git a/examples/example2/example2_withadvection.ipynb b/examples/example2/example2_withadvection.ipynb index 1944777..7c549f0 100644 --- a/examples/example2/example2_withadvection.ipynb +++ b/examples/example2/example2_withadvection.ipynb @@ -139,10 +139,14 @@ "# name, topological dimensionality, length scale units, marker value\n", "# Cyto = Compartment(\"Cyto\", 2, um, 1, vel=(\"-0.1*y*(1 - (x**2+y**2))\",\"0.1*x*(1 - (x**2+y**2))\",\"0\"))\n", "# Cyto = Compartment(\"Cyto\", 2, um, 1, deform=(\"-0.1*y*t*(1 - (x**2+y**2))\",\"0.1*x*t*(1 - (x**2+y**2))\",\"0\"), manual_update=True)\n", - "Cyto = Compartment(\"Cyto\", 2, um, 1, deform=(\"((1+sign(t-10))/2)*0.005*(t-10)*x/(1-0.005*(t-10))\",\n", - " \"-((1+sign(t-10))/2)*0.005*(t-10)*y\",\"0\")) # dilation\n", - "PM = Compartment(\"PM\", 1, um, 3, deform=(\"((1+sign(t-10))/2)*0.005*(t-10)*x/(1-0.005*(t-10))\",\n", - " \"-((1+sign(t-10))/2)*0.005*(t-10)*y\",\"0\"))\n", + "# Cyto = Compartment(\"Cyto\", 2, um, 1, deform=(\"((1+sign(t-10))/2)*0.005*(t-10)*x/(1-0.005*(t-10))\",\n", + "# \"-((1+sign(t-10))/2)*0.005*(t-10)*y\")) # dilation\n", + "# PM = Compartment(\"PM\", 1, um, 3, deform=(\"((1+sign(t-10))/2)*0.005*(t-10)*x/(1-0.005*(t-10))\",\n", + "# \"-((1+sign(t-10))/2)*0.005*(t-10)*y\"))\n", + "Cyto = Compartment(\"Cyto\", 2, um, 1, deform=(\"-((1+sign(t-10))/2)*0.005*x*(t-10)\",\n", + " \"-((1+sign(t-10))/2)*0.005*y*(t-10)\")) # dilation\n", + "PM = Compartment(\"PM\", 1, um, 3, deform=(\"-((1+sign(t-10))/2)*0.005*x*(t-10)\",\n", + " \"-((1+sign(t-10))/2)*0.005*y*(t-10)\"))\n", "cc = CompartmentContainer()\n", "cc.add([Cyto, PM])\n", "\n", @@ -162,8 +166,8 @@ "# =============================================================================================\n", "\n", "# Reaction of A and X to make B (Cyto-PM reaction)\n", - "kon = Parameter(\"kon\", 1.0, 1/(surf_unit*sec))\n", - "koff = Parameter(\"koff\", 1.0, 1/sec)\n", + "kon = Parameter(\"kon\", 0.0, 1/(surf_unit*sec))\n", + "koff = Parameter(\"koff\", 0.0, 1/sec)\n", "r1 = Reaction(\"r1\", [\"A\", \"X\"], [\"B\"],\n", " param_map={\"on\": \"kon\", \"off\": \"koff\"},\n", " species_map={\"A\": \"A\", \"X\": \"X\", \"B\": \"B\"})\n", @@ -254,7 +258,7 @@ "config_cur = config.Config()\n", "config_cur.solver.update(\n", " {\n", - " \"final_t\": 130.0,\n", + " \"final_t\": 100.0,\n", " \"initial_dt\": 1.0,\n", " \"time_precision\": 6,\n", " }\n", @@ -284,7 +288,7 @@ "source": [ "model_cur.to_pickle('model_cur.pkl')\n", "results = dict()\n", - "result_folder = pathlib.Path(\"resultsEllipse_testShapeChange\")\n", + "result_folder = pathlib.Path(\"resultsEllipse_testShapeChangeNoReaction\")\n", "result_folder.mkdir(exist_ok=True)\n", "for species_name, species in model_cur.sc.items:\n", " results[species_name] = d.XDMFFile(\n", @@ -308,7 +312,14 @@ " # v1file = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"v1.xdmf\"))\n", " # v1file.parameters[\"flush_output\"] = True\n", " # v2file = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"v2.xdmf\"))\n", - " # v2file.parameters[\"flush_output\"] = True" + " # v2file.parameters[\"flush_output\"] = True\n", + " udef = cc[\"Cyto\"].deform_func\n", + " Fcyto = d.Identity(udef.geometric_dimension()) + d.grad(udef)\n", + " Vscalar = d.FunctionSpace(cc[\"Cyto\"].dolfin_mesh, \"P\", 1)\n", + " Jcyto = d.project(d.det(Fcyto), Vscalar)\n", + " Jcytofile = d.XDMFFile(model_cur.mpi_comm_world, str(result_folder / f\"Jcyto.xdmf\"))\n", + " Jcytofile.parameters[\"flush_output\"] = True\n", + " Jcytofile.write(Jcyto, model_cur.t)" ] }, { @@ -334,12 +345,13 @@ "dx_PM = d.Measure(\"dx\", domain=model_cur.cc['PM'].dolfin_mesh)\n", "volume = d.assemble_mixed(1.0*dx_Cyto)\n", "PM_SA = d.assemble_mixed(1.0*dx_PM)\n", - "avg_A = [d.assemble_mixed(A.u['u']*dx_Cyto) / volume]\n", + "avg_A = [d.assemble_mixed(Jcyto*A.u['u']*dx_Cyto)]# / volume]\n", "avg_X = [d.assemble_mixed(X.u[\"u\"]*dx_PM) / PM_SA]\n", "avg_B = [d.assemble_mixed(B.u[\"u\"]*dx_PM) / PM_SA]\n", "# Set loglevel to warning in order not to pollute notebook output\n", "logger.setLevel(logging.WARNING)\n", "x = d.SpatialCoordinate(sc[\"A\"].compartment.dolfin_mesh)\n", + "\n", "# if cc[\"Cyto\"].deform_logic:\n", "# udef = cc[\"Cyto\"].deform_func\n", "# udef_local = udef.copy()\n", @@ -354,12 +366,20 @@ "while True:\n", " # Solve the system\n", " model_cur.monolithic_solve()\n", + " # test manual advection\n", + " # if cc[\"Cyto\"].deform_logic:\n", + " # udef = cc[\"Cyto\"].deform_func\n", + " # Fcyto = d.Identity(udef.geometric_dimension()) + d.grad(udef)\n", + " # Jcur = d.det(Fcyto)\n", + " # uprev = cc[\"Cyto\"].deform_prev\n", + " # Fprev = d.Identity(uprev.geometric_dimension()) + d.grad(uprev)\n", + " # Jprev = d.det(Fprev)\n", + " # u_advected = d.project(sc[\"A\"].u[\"u\"]*Jprev/Jcur, Vscalar)\n", + " # sc[\"A\"].u[\"u\"].assign(u_advected)\n", + " # sc[\"A\"].u[\"n\"].assign(u_advected)\n", " # Save results for post processing\n", " for species_name, species in model_cur.sc.items:\n", " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", - " avg_A.append(d.assemble_mixed(A.u['u']*dx_Cyto) / volume)\n", - " avg_X.append(d.assemble_mixed(X.u[\"u\"]*dx_PM) / PM_SA)\n", - " avg_B.append(d.assemble_mixed(B.u[\"u\"]*dx_PM) / PM_SA)\n", " tvec.append(model_cur.t)\n", " # save deformation or velocity\n", " if cc[\"Cyto\"].vel_logic:\n", @@ -369,6 +389,10 @@ " # udef.assign(udef_local + vel*d.Constant(model_cur.tvec[-1]-model_cur.tvec[-2]))\n", " u1file.write(cc[\"Cyto\"].deform_func, model_cur.t)\n", " u2file.write(cc[\"PM\"].deform_func, model_cur.t)\n", + " udef = cc[\"Cyto\"].deform_func\n", + " Fcyto = d.Identity(udef.geometric_dimension()) + d.grad(udef)\n", + " Jcyto.assign(d.project(d.det(Fcyto), Vscalar))\n", + " Jcytofile.write(Jcyto, model_cur.t)\n", " # multCur = d.project(model_cur.fc[\"r1 [X (f)]\"].integral_factor,X.V)\n", " # if np.any(np.isnan(multCur.vector()[:])):\n", " # udef = cc[\"Cyto\"].deform_func\n", @@ -403,6 +427,11 @@ " # v1file.write(vel, model_cur.t)\n", " # vel_approx.assign(d.project((udef - cc[\"Cyto\"].deform_prev) / model_cur.dT, V_vector))\n", " # v2file.write(vel_approx, model_cur.t)\n", + " cur_vol = d.assemble_mixed(Jcyto*dx_Cyto)\n", + " print(f\"Cur vol is {cur_vol}\")\n", + " avg_A.append(d.assemble_mixed(Jcyto*A.u['u']*dx_Cyto))# / cur_vol)\n", + " avg_X.append(d.assemble_mixed(X.u[\"u\"]*dx_PM) / PM_SA)\n", + " avg_B.append(d.assemble_mixed(B.u[\"u\"]*dx_PM) / PM_SA)\n", "\n", " print(f\"Done with t={model_cur.t}\")\n", " # End if we've passed the final time\n", @@ -435,13 +464,13 @@ "plt.plot(tvec, avg_A, label='SMART simulation')\n", "plt.xlabel('Time (s)')\n", "plt.ylabel('A concentration $\\mathrm{(molecules/μm^2)}$')\n", - "SA_vol = 4/(xrad + yrad)\n", - "root_vals = np.roots([-kon.value,\n", - " -kon.value*avg_X[0]*SA_vol - koff.value + kon.value*avg_A[0],\n", - " koff.value*avg_A[0]])\n", - "ss_pred = root_vals[root_vals > 0]\n", - "plt.plot(tvec, np.ones(len(avg_A))*ss_pred, '--', label='Steady-state analytical prediction')\n", - "plt.legend()\n", + "# SA_vol = 4/(xrad + yrad)\n", + "# root_vals = np.roots([-kon.value,\n", + "# -kon.value*avg_X[0]*SA_vol - koff.value + kon.value*avg_A[0],\n", + "# koff.value*avg_A[0]])\n", + "# ss_pred = root_vals[root_vals > 0]\n", + "# plt.plot(tvec, np.ones(len(avg_A))*ss_pred, '--', label='Steady-state analytical prediction')\n", + "# plt.legend()\n", "# from cowpy import cow\n", "# if True:#percent_error_analytical > 0.1:\n", "# stegy = cow.Stegosaurus(thoughts=True)\n", diff --git a/pyproject.toml b/pyproject.toml index 4a5e39a..dcbbf2e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=61.0.0", "wheel"] [project] name = "fenics-smart" -version = "2.3.1.alpha.1" +version = "2.3.1.alpha.2" description = "Spatial Modeling Algorithms for Reactions and Transport (SMART) is a high-performance finite-element-based simulation package for model specification and numerical simulation of spatially-varying reaction-transport processes in biological cells." authors = [{ name = "Justin Laughlin", email = "justinglaughlin@gmail.com" }] license = { file = "LICENSE" } diff --git a/smart/mesh_tools.py b/smart/mesh_tools.py index 63fe61b..e3b7335 100644 --- a/smart/mesh_tools.py +++ b/smart/mesh_tools.py @@ -799,7 +799,7 @@ def create_multicell( raise ValueError("Radii must be floats or lists of 3 floats") if isinstance(cellRadCur, float): cellRads = [cellRadCur, cellRadCur, cellRadCur] - if len(cellRadCur) == 3: + elif len(cellRadCur) == 3: cellRads = cellRadCur else: raise ValueError("Radii must be floats or lists of 3 floats") @@ -831,7 +831,7 @@ def create_multicell( raise ValueError("Radii must be floats or lists of 3 floats") if isinstance(cellRadCur, float): cellRads = [cellRadCur, cellRadCur, cellRadCur] - if len(cellRadCur) == 3: + elif len(cellRadCur) == 3: cellRads = cellRadCur else: raise ValueError("Radii must be floats or lists of 3 floats") @@ -952,7 +952,7 @@ def meshSizeCallback(dim, tag, x, y, z, lc): gmsh.model.mesh.generate(3) rank = MPI.COMM_WORLD.rank - tmp_folder = pathlib.Path(f"tmp_extracell_{cubeSize}_{cellRad1}_{cellRad2}_{rank}") + tmp_folder = pathlib.Path(f"tmp_extracell_{rank}") tmp_folder.mkdir(exist_ok=True) gmsh_file = tmp_folder / "extracell.msh" gmsh.write(str(gmsh_file)) diff --git a/smart/model.py b/smart/model.py index 82c2c9a..7964faf 100644 --- a/smart/model.py +++ b/smart/model.py @@ -829,6 +829,7 @@ def _init_4_2_define_dolfin_function_spaces(self): self.child_meshes[compartment.name].dolfin_mesh, "P", 1 ) + for compartment in self._all_compartments: # do this for all compartments to be safe if self.parent_mesh.curvature is not None: scalarFunctionSpace = d.FunctionSpace( self.child_meshes[compartment.name].dolfin_mesh, "P", 1 @@ -986,6 +987,25 @@ def _init_4_7_set_initial_conditions(self): """ logger.debug("Set function values to initial conditions", extra=dict(format_type="log")) for species in self.sc: + # first, initialize diffusion coefficient + if isinstance(species.D, float): + species.D_dolfin = d.Constant(species.D) + else: # then this still needs to have free symbols inserted + x, y, z = (sym.Symbol(f"x[{i}]") for i in range(3)) + # Parse the given string to create a sympy expression + sym_expr = parse_expr(species.D).subs({"x": x, "y": y, "z": z}) + free_symbols = [str(x) for x in sym_expr.free_symbols] + if not {"x[0]", "x[1]", "x[2]", "curv"}.issuperset(free_symbols): + # could add other keywords for spatial dependence in the future + raise NotImplementedError + else: + x = d.SpatialCoordinate(species.compartment.dolfin_mesh) + curv = species.compartment.curv_func + c_code = sym.printing.ccode(sym_expr) + c_code = c_code.replace("log(", "std::log(") + full_expr = d.Expression(c_code, curv=curv, degree=1) + ufunc = d.interpolate(full_expr, species.V) + species.D_dolfin = ufunc for ukey in species.u.keys(): if isinstance(species.initial_condition, float) or not isinstance( species.initial_condition, str @@ -1004,6 +1024,61 @@ def _init_4_7_set_initial_conditions(self): values[species.dof_map] = values_new[species.dof_map] u_cur.vector().set_local(values) u_cur.vector().apply("insert") + species.alt_vel_logic = np.any([vel != 0.0 for vel in species.alt_vel]) + species.alt_deform_logic = np.any([deform != 0.0 for deform in species.alt_deform]) + if species.alt_vel_logic and species.alt_deform_logic: + raise ValueError("Cannot prescribe both velocity and deformation") + elif species.alt_vel_logic: + x, y, z = (sym.Symbol(f"x[{i}]") for i in range(3)) + vel_expr = [None] * len(species.alt_vel) + # then this needs to have free symbols inserted + for i in range(len(species.vel)): + if isinstance(species.vel[i], float): + vel_expr[i] = f"{species.alt_vel[i]}" + elif isinstance(species.alt_vel[i], str): + vel_str = species.alt_vel[i] + # Parse the given string to create a sympy expression + sym_expr = parse_expr(vel_str).subs({"x": x, "y": y, "z": z}) + free_symbols = [str(x) for x in sym_expr.free_symbols] + if not {"x[0]", "x[1]", "x[2]", "t"}.issuperset(free_symbols): + # could add other keywords for spatial dependence in the future + raise NotImplementedError + else: + vel_expr[i] = sym.printing.ccode(sym_expr) + else: + raise NotImplementedError("Velocity must be float or string") + species.alt_vel_expr = d.Expression(vel_expr, degree=1, t=self.T) + V_vector = d.VectorFunctionSpace(species.compartment.dolfin_mesh, "P", 1) + species.alt_vel_func = d.interpolate(species.alt_vel_expr, V_vector) + elif species.alt_deform_logic: + x, y, z = (sym.Symbol(f"x[{i}]") for i in range(3)) + deform_expr = [None] * len(species.alt_deform) + # then this needs to have free symbols inserted + for i in range(len(species.alt_deform)): + if isinstance(species.alt_deform[i], float): + deform_expr[i] = f"{species.alt_deform[i]}" + elif isinstance(species.alt_deform[i], str): + deform_str = species.alt_deform[i] + # Parse the given string to create a sympy expression + sym_expr = parse_expr(deform_str).subs({"x": x, "y": y, "z": z}) + free_symbols = [str(x) for x in sym_expr.free_symbols] + if not {"x[0]", "x[1]", "x[2]", "t"}.issuperset(free_symbols): + # could add other keywords for spatial dependence in the future + raise NotImplementedError + else: + deform_expr[i] = sym.printing.ccode(sym_expr) + else: + raise NotImplementedError("Deformation must be float or string") + species.alt_deform_expr = d.Expression(deform_expr, degree=1, t=self.T) + V_vector = d.VectorFunctionSpace(species.compartment.dolfin_mesh, "P", 1) + V_scalar = d.FunctionSpace(species.compartment.dolfin_mesh, "P", 1) + species.alt_deform_func = d.interpolate(species.alt_deform_expr, V_vector) + F = d.Identity(species.alt_deform_func.geometric_dimension()) + d.grad( + species.alt_deform_func + ) + species.alt_jacobian = d.project(d.det(F), V_scalar) + species.alt_jacobian_prev = d.project(d.det(F), V_scalar) + species.alt_deform_prev = d.interpolate(species.alt_deform_expr, V_vector) for parameter in self.pc: if parameter.type == ParameterType.from_xdmf: @@ -1077,6 +1152,8 @@ def _init_4_7_set_initial_conditions(self): elif compartment.deform_logic: x, y, z = (sym.Symbol(f"x[{i}]") for i in range(3)) deform_expr = [None] * len(compartment.deform) + if not compartment.manual_update: + vel_expr = [None] * len(compartment.deform) # then this needs to have free symbols inserted for i in range(len(compartment.deform)): if isinstance(compartment.deform[i], float): @@ -1091,51 +1168,90 @@ def _init_4_7_set_initial_conditions(self): raise NotImplementedError else: deform_expr[i] = sym.printing.ccode(sym_expr) + if not compartment.manual_update: + vel_str = str(sym.diff(compartment.deform[0], "t")) + vel_sym_expr = parse_expr(vel_str).subs({"x": x, "y": y, "z": z}) + vel_expr[i] = sym.printing.ccode(vel_sym_expr) else: raise NotImplementedError("Deformation must be float or string") compartment.deform_expr = d.Expression(deform_expr, degree=1, t=self.T) V_vector = d.VectorFunctionSpace(compartment.dolfin_mesh, "P", 1) + V_scalar = d.FunctionSpace(compartment.dolfin_mesh, "P", 1) compartment.deform_func = d.interpolate(compartment.deform_expr, V_vector) + V_vector_global = d.VectorFunctionSpace(self.parent_mesh.dolfin_mesh, "P", 1) + compartment.deform_func_global = d.interpolate( + compartment.deform_expr, V_vector_global + ) + compartment.deform_func_global.set_allow_extrapolation(True) + compartment.deform_prev_global = d.interpolate( + compartment.deform_expr, V_vector_global + ) + compartment.deform_prev_global.set_allow_extrapolation(True) + if not compartment.manual_update: + compartment.vel_expr = d.Expression(vel_expr, degree=1, t=self.T) + compartment.vel_func = d.interpolate(compartment.vel_expr, V_vector) + F = d.Identity(compartment.deform_func.geometric_dimension()) + d.grad( + compartment.deform_func + ) compartment.deform_prev = d.interpolate(compartment.deform_expr, V_vector) - if not compartment.is_volume: # then is a surface and must compute normals - surf_coords = compartment.dolfin_mesh.coordinates() - for c in self.cc: # find an adjacent volume! - if c.is_volume: - mesh_test = c.dolfin_mesh - test_coords = mesh_test.coordinates() - adjacent = True - for i in range(len(surf_coords)): - if surf_coords[i] not in test_coords: - adjacent = False + if compartment.is_volume: + compartment.jacobian = d.project(d.det(F), V_scalar) + compartment.jacobian_prev = d.project(d.det(F), V_scalar) + else: # then is a surface and must compute normals + if not np.all(np.array(compartment.normals) == 0): + compartment.normals = d.Expression(compartment.normals, degree=1) + else: + surf_coords = compartment.dolfin_mesh.coordinates() + for c in self.cc: # find an adjacent volume! + if c.is_volume: + mesh_test = c.dolfin_mesh + test_coords = mesh_test.coordinates() + adjacent = True + for i in range(len(surf_coords)): + if surf_coords[i] not in test_coords: + adjacent = False + break + if adjacent: + mesh_ref = mesh_test break - if adjacent: - mesh_ref = mesh_test - break - if not adjacent: - raise ValueError("Could not find an adjacent volume to compute normals!") - ref_normals = d.FacetNormal(mesh_ref) - Vcur = d.VectorFunctionSpace(mesh_ref, "P", 1) - ucur = d.TrialFunction(Vcur) - vcur = d.TestFunction(Vcur) - ds = d.Measure("ds", mesh_ref) - a = d.inner(ucur, vcur) * ds - lform = d.inner(ref_normals, vcur) * ds - A = d.assemble(a, keep_diagonal=True) - L = d.assemble(lform) - A.ident_zeros() - nh = d.Function(Vcur) - d.solve(A, nh.vector(), L) # project facet normals onto CG1 - Vbound = d.VectorFunctionSpace(compartment.mesh.dolfin_mesh, "P", 1) - norm_calc = d.interpolate(nh, Vbound) - nvec = norm_calc.vector()[:] - # normalize magnitudes for consistency (unit normal) - for i in range(int(len(nvec) / 3)): - vec_cur = nvec[3 * i : 3 * (i + 1)] - mag_cur = np.sqrt(vec_cur[0] ** 2 + vec_cur[1] ** 2 + vec_cur[2] ** 2) - nvec[3 * i : 3 * (i + 1)] = vec_cur / mag_cur - norm_calc.vector().set_local(nvec) - norm_calc.vector().apply("insert") - compartment.normals = norm_calc + if not adjacent: + raise ValueError( + "Could not find an adjacent volume to compute normals!" + ) + ref_normals = d.FacetNormal(mesh_ref) + Vcur = d.VectorFunctionSpace(mesh_ref, "P", 1) + ucur = d.TrialFunction(Vcur) + vcur = d.TestFunction(Vcur) + ds = d.Measure("ds", mesh_ref) + a = d.inner(ucur, vcur) * ds + lform = d.inner(ref_normals, vcur) * ds + A = d.assemble(a, keep_diagonal=True) + L = d.assemble(lform) + A.ident_zeros() + nh = d.Function(Vcur) + d.solve(A, nh.vector(), L) # project facet normals onto CG1 + Vbound = d.VectorFunctionSpace(compartment.mesh.dolfin_mesh, "P", 1) + norm_calc = d.interpolate(nh, Vbound) + nvec = norm_calc.vector()[:] + # normalize magnitudes for consistency (unit normal) + for i in range(int(len(nvec) / 3)): + vec_cur = nvec[3 * i : 3 * (i + 1)] + mag_cur = np.sqrt(vec_cur[0] ** 2 + vec_cur[1] ** 2 + vec_cur[2] ** 2) + nvec[3 * i : 3 * (i + 1)] = vec_cur / mag_cur + norm_calc.vector().set_local(nvec) + norm_calc.vector().apply("insert") + compartment.normals = norm_calc + compartment.deformed_normals = d.project(compartment.normals, V_vector) + for sp in compartment.species.values(): + if sp.alt_deform_logic: + sp.alt_deformed_normals = d.project( + species.compartment.normals, V_vector + ) + logger.warning( + "Currently, surface jacobians must be manually assigned in model file" + ) + compartment.jacobian = d.project(d.Constant(1.0), V_scalar) + compartment.jacobian_prev = d.project(d.Constant(1.0), V_scalar) def _init_5_1_reactions_to_fluxes(self): """Convert reactions to flux objects""" @@ -1191,7 +1307,7 @@ def _init_5_2_create_variational_forms(self): # un = species.u['n'] un = species._usplit["n"] v = species.v - D = species.D + D = species.D_dolfin dx = species.compartment.mesh.dx Dform_units = ( species.diffusion_units @@ -1203,12 +1319,22 @@ def _init_5_2_create_variational_forms(self): / unit.s * species.compartment.compartment_units**species.compartment.dimensionality ) - lagrange = species.compartment.deform_logic + lagrange = species.compartment.deform_logic or species.alt_deform_logic # define current jacobian if lagrange: - udef = species.compartment.deform_func - F = d.Identity(3) + d.grad(udef) - J = d.det(F) + if species.alt_deform_logic: + udef = species.alt_deform_func + # uprev = species.alt_deform_prev + J = species.alt_jacobian + if not species.compartment.is_volume: + ncur = species.alt_deformed_normals + else: + udef = species.compartment.deform_func + # uprev = species.compartment.deform_prev + J = species.compartment.jacobian + if not species.compartment.is_volume: + ncur = species.compartment.deformed_normals + F = d.Identity(udef.geometric_dimension()) + d.grad(udef) else: J = d.Constant(1.0) if self.config.flags["axisymmetric_model"]: @@ -1223,13 +1349,12 @@ def _init_5_2_create_variational_forms(self): else: if lagrange: # then nonzero advection # alt Lagrangian form - D_constant = d.Constant(D, name=f"D_{species.name}") - Dform = ( - D_constant - * J - * d.inner(d.dot(d.inv(F.T), d.grad(u)), d.dot(d.inv(F.T), d.grad(v))) - * dx - ) + uderiv = d.dot(d.inv(F.T), d.grad(u)) + vderiv = d.dot(d.inv(F.T), d.grad(v)) + if not species.compartment.is_volume: # then account for change in normal dir + uderiv -= ncur * d.dot(ncur, d.dot(d.inv(F.T), d.grad(u))) + vderiv -= ncur * d.dot(ncur, d.dot(d.inv(F.T), d.grad(v))) + Dform = D * J * d.inner(uderiv, vderiv) * dx self.forms.add( Form( f"diffusion_{species.name}", @@ -1242,8 +1367,7 @@ def _init_5_2_create_variational_forms(self): ) ) else: - D_constant = d.Constant(D, name=f"D_{species.name}") - Dform = J * D_constant * d.inner(d.grad(u), d.grad(v)) * dx + Dform = J * D * d.inner(d.grad(u), d.grad(v)) * dx # exponent is -2 because of two gradients self.forms.add( @@ -1258,23 +1382,14 @@ def _init_5_2_create_variational_forms(self): ) ) if lagrange: # account for volume changes due to advection - vel_approx = (udef - species.compartment.deform_prev) / self.dT - Aform = J * u * v * d.inner(d.inv(F.T), d.grad(vel_approx)) * dx - # Aform = J * u * v * d.inner(vel, d.dot(d.inv(F.T), d.grad(u))) * dx - self.forms.add( - Form( - f"advection_{species.name}", - Aform, - species, - "advection", - mass_form_units, - True, - linear_wrt_comp, - ) - ) - elif species.compartment.vel_logic: # then nonzero advection - vel = species.compartment.vel_func - Aform = J * u * v * d.div(vel) * dx + J * d.inner(v * vel, d.grad(u)) * dx + logger.info("Bypass, account for advection separately") + elif species.compartment.vel_logic or species.alt_vel_logic: # then nonzero advection + if species.alt_vel_logic: + vel = species.alt_vel_func + else: + vel = species.compartment.vel_func + Aform = J * u * d.inner(vel, d.grad(v)) * dx + # J * u * v * d.div(vel) * dx + J * d.inner(v * vel, d.grad(u)) * dx self.forms.add( Form( f"advection_{species.name}", @@ -1770,6 +1885,7 @@ def monolithic_solve(self): ), ) self.update_time_dependent_parameters() + if self.config.solver["use_snes"]: logger.info("Solving using PETSc.SNES Solver", dict(format_type="log")) self.stopwatches["snes all"].start() @@ -1935,7 +2051,51 @@ def monolithic_solve(self): # self.data['tvec'].update(self.t) # self.data['dtvec'].update(self.dt) + # apply advection correction if using Lagrangian approach + for compartment in self._active_compartments: + if compartment.deform_logic: + # Vtest = d.FunctionSpace(compartment.dolfin_mesh, "P", 1) + # dxTest = d.Measure("dx", compartment.dolfin_mesh) + Jcur = compartment.jacobian + Jprev = compartment.jacobian_prev + for sp in compartment.species.values(): + if not sp.alt_deform_logic: + u_advected = d.project(sp.u["u"] * Jprev / Jcur, sp.V) + # check mass conservation + # massPrev = d.assemble_mixed(Jprev * sp.sol * dxTest) + # massCur = d.assemble_mixed(Jcur * u_advected * dxTest) + # if np.abs((massCur-massPrev)/massPrev) > 1e-8: + # logger.warning("May need to add correction factor here!!!") + uvec = sp.u["u"].vector()[:] + uvec[sp.dof_map] = u_advected.vector()[:] + for key in ["u", "n"]: + sp.u[key].vector().set_local(uvec) + sp.u[key].vector().apply("insert") + + # now assign current deformation to previous deformation + compartment.deform_prev.assign(compartment.deform_func.copy(deepcopy=True)) + compartment.jacobian_prev.assign(compartment.jacobian.copy(deepcopy=True)) + compartment.deform_prev_global.assign( + compartment.deform_func_global.copy(deepcopy=True) + ) + + for species in self.sc: + if species.alt_deform_logic: + Jcur = species.alt_jacobian + Jprev = species.alt_jacobian_prev + u_advected = d.project(species.u["u"] * Jprev / Jcur, species.V) + uvec = species.u["u"].vector()[:] + uvec[species.dof_map] = u_advected.vector()[:] + for key in ["u", "n"]: + species.u[key].vector().set_local(uvec) + species.u[key].vector().apply("insert") + + # now assign current deformation to previous deformation + species.alt_deform_prev.assign(species.alt_deform_func.copy(deepcopy=True)) + species.alt_jacobian_prev.assign(species.alt_jacobian.copy(deepcopy=True)) + self.update_solution() # assign most recently computed solution to "previous solution" + # self.adjust_dt() # adjusts dt based on number of nonlinear iterations required # self.stopwatch("Total time step", stop=True) self.stopwatches["Total time step"].stop() @@ -2014,8 +2174,27 @@ def update_time_dependent_parameters(self): compartment.vel_func.assign(d.interpolate(compartment.vel_expr, Vcur)) elif compartment.deform_logic and not compartment.manual_update: Vcur = compartment.deform_func.function_space() - compartment.deform_prev.assign(compartment.deform_func.copy(deepcopy=True)) compartment.deform_func.assign(d.interpolate(compartment.deform_expr, Vcur)) + compartment.vel_func.assign(d.interpolate(compartment.vel_expr, Vcur)) + F = d.Identity(compartment.deform_func.geometric_dimension()) + d.grad( + compartment.deform_func + ) + V_scalar = compartment.jacobian.function_space() + compartment.jacobian.assign(d.project(d.det(F), V_scalar)) + + # Update species-specific velocity or deformation if applicable + for species in self.sc: + if species.alt_vel_logic and not species.alt_manual_update: + Vcur = species.alt_vel_func.function_space() + species.alt_vel_func.assign(d.interpolate(species.alt_vel_expr, Vcur)) + elif species.alt_deform_logic and not species.alt_manual_update: + Vcur = species.alt_deform_func.function_space() + species.alt_deform_func.assign(d.interpolate(species.alt_deform_expr, Vcur)) + F = d.Identity(species.alt_deform_func.geometric_dimension()) + d.grad( + species.alt_deform_func + ) + V_scalar = species.alt_jacobian.function_space() + species.alt_jacobian.assign(d.project(d.det(F), V_scalar)) # Update time dependent parameters for parameter_name, parameter in self.pc.items: diff --git a/smart/model_assembly.py b/smart/model_assembly.py index 2181ef2..55abd2b 100644 --- a/smart/model_assembly.py +++ b/smart/model_assembly.py @@ -979,12 +979,15 @@ class Species(ObjectInstance): """ name: str - initial_condition: Any + initial_condition: Union[float, int, str, Path] concentration_units: pint.Unit - D: float + D: Union[float, int, str] diffusion_units: pint.Unit compartment_name: str group: str = "" + alt_deform: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) + alt_vel: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) + alt_manual_update: bool = False def to_dict(self): "Convert to a dict that can be used to recreate the object." @@ -1015,6 +1018,13 @@ def __post_init__(self): self.v = None self.has_subdomain = False + self.alt_vel_expr = None + self.alt_vel_func = None + self.alt_deform_expr = None + self.alt_deform_func = None + self.alt_vel_logic = False + self.alt_deform_logic = False + if isinstance(self.initial_condition, float): pass elif isinstance(self.initial_condition, int): @@ -1044,6 +1054,13 @@ def __post_init__(self): else: raise TypeError("initial_condition must be a float or string or path.") + if isinstance(self.D, float) or isinstance(self.D, str): + pass + elif isinstance(self.D, int): + self.D = float(self.D) + else: + raise TypeError("Diffusion coefficient must a float, int, or string") + self._convert_pint_quantity_to_unit() self._check_input_type_validity() self._convert_pint_unit_to_quantity() @@ -1061,7 +1078,7 @@ def check_validity(self): raise ValueError( f"Initial condition for species {self.name} must be greater or equal to 0." ) - if self.D < 0.0: + if isinstance(self.D, float) and self.D < 0.0: raise ValueError( f"Diffusion coefficient for species {self.name} must be greater or equal to 0." ) @@ -1095,7 +1112,10 @@ def initial_condition_quantity(self): @property def D_quantity(self): - self._Diffusion = self.D * self.diffusion_units + if isinstance(self.D, float): + self._Diffusion = self.D * self.diffusion_units + else: + self._Diffusion = f"{self.D} * {self.diffusion_units}" return self._Diffusion @property @@ -1182,6 +1202,7 @@ class Compartment(ObjectInstance): vel: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) deform: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) manual_update: bool = False + normals: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) def to_dict(self): "Convert to a dict that can be used to recreate the object." @@ -1215,6 +1236,7 @@ def __post_init__(self): self.vel_func = None self.deform_expr = None self.deform_func = None + self.deform_func_global = None self.vel_logic = False self.deform_logic = False @@ -1856,17 +1878,22 @@ def form(self): if self.topology in ["volume", "surface"]: if self.destination_compartment.deform_logic: - udef = self.destination_compartment.deform_func - Fcur = d.Identity(3) + d.grad(udef) + alt_logic = True + for sp in self.species.values(): + if not sp.alt_deform_logic: + alt_logic = False + if alt_logic: + udef = sp.alt_deform_func + # Jcur = sp.alt_jacobian + else: + udef = self.destination_compartment.deform_func + # Jcur = self.destination_compartment.jacobian + Fcur = d.Identity(udef.geometric_dimension()) + d.grad(udef) Jcur = d.det(Fcur) if self.topology == "surface": - # Nexpr = d.Expression(("x[0]/R", "x[1]/R", "0.0"), degree=1, R=1) - # Vcur = d.VectorFunctionSpace(self.surface.mesh.dolfin_mesh, "P", 1) - # N = d.interpolate(Nexpr, Vcur) - N = self.surface.normals - self.integral_factor = Jcur * d.sqrt( - d.inner(d.dot(N, d.inv(Fcur)), d.dot(N, d.inv(Fcur))) - ) + self.integral_factor = ( + self.destination_compartment.jacobian + ) # d.sqrt(d.inner(areaFactor, areaFactor)) else: # then volume self.integral_factor = Jcur # mult *= Jcur @@ -1889,16 +1916,18 @@ def form(self): # vol_ref = source_list[0] # else: # vol_ref = self.destination_compartment - udef = self.surface.deform_func - Fcur = d.Identity(3) + d.grad(udef) - Jcur = d.det(Fcur) + # udef = self.surface.deform_func + # Fcur = d.Identity(udef.geometric_dimension()) + d.grad(udef) + # uglobal = self.surface.deform_func_global + # Fglobal = d.Identity(uglobal.geometric_dimension()) + d.grad(uglobal) + # areaFactor = d.det(Fglobal) * d.dot(self.surface.normals, d.inv(Fglobal)) + self.integral_factor = ( + self.surface.jacobian + ) # d.sqrt(d.inner(areaFactor, areaFactor)) # Nexpr = d.Expression(("x[0]/R", "x[1]/R", "0.0"), degree=1, R=1) # Vcur = d.VectorFunctionSpace(self.surface.mesh.dolfin_mesh, "P", 1) # N = d.interpolate(Nexpr, Vcur) - N = self.surface.normals - self.integral_factor = Jcur * d.sqrt( - d.inner(d.dot(N, d.inv(Fcur)), d.dot(N, d.inv(Fcur))) - ) + # self.integral_factor = Jcur # mult *= self.integral_factor elif ( self.destination_compartment.deform_logic From 379ac336cabafde627b06b78f2a2d6b62834c9c2 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:18:24 -0700 Subject: [PATCH 21/25] some mesh tools updates, but mostly changes to allow for species governed by CH aggregation-diffusion --- examples/example1/example1_CH.ipynb | 620 ++++++++++++++++++++++++++++ examples/example1/model_cur.pkl | Bin 0 -> 1864 bytes examples/example9/example9.ipynb | 299 ++++++++++++++ examples/example9/model_cur.pkl | Bin 0 -> 2388 bytes smart/mesh_tools.py | 209 ++++++++++ smart/model.py | 93 ++++- smart/model_assembly.py | 11 + 7 files changed, 1229 insertions(+), 3 deletions(-) create mode 100644 examples/example1/example1_CH.ipynb create mode 100644 examples/example1/model_cur.pkl create mode 100644 examples/example9/example9.ipynb create mode 100644 examples/example9/model_cur.pkl diff --git a/examples/example1/example1_CH.ipynb b/examples/example1/example1_CH.ipynb new file mode 100644 index 0000000..111a673 --- /dev/null +++ b/examples/example1/example1_CH.ipynb @@ -0,0 +1,620 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f65f18d7", + "metadata": {}, + "source": [ + "# Example 1-CH: Cahn Hilliard patterns for 2D aggregation-diffusion\n", + "\n", + "In this case, we consider a simple 2D geometry comprised of two compartments:\n", + "- surf - 2D surface\n", + "- edge - outer edges of the surface (1D)\n", + "\n", + "We implement a Cahn-Hilliard model with two species, one exhibiting aggregation-diffusion ($A$) and the other purely diffusive ($B$).\n", + "The equations governing their evolution are given by:\n", + "\n", + "$$\n", + "\\partial_t{u_A} = -k_{on} u_A + k_{off} u_B + D_A \\nabla \\cdot (\\hat{\\mu}_A \\nabla u_A) \\\\\n", + "\\partial_t{u_B} = k_{on} u_A - k_{off} u_B + D_B \\nabla \\cdot (\\nabla u_B),\n", + "$$\n", + "\n", + "where aggregation is accounted for through the chemical potential of $A$, whose nondimensional version ($\\hat{\\mu}_A = \\frac{\\mu_A}{k_B T}) is given by\n", + "\n", + "$$\n", + "\\hat{\\mu}_A = (\\ln \\phi_A - \\ln (1-\\phi_A)) - \\hat{A} (2 \\phi_A - 1) - \\hat{A} \\nabla^2 \\phi_A\n", + "$$\n", + "\n", + "in which $\\phi_A$ is the area fraction occupied by species A, which is proportional to its concentration; that is, $\\phi_A = \\frac{u_A}{u_{A,max}}$\n", + "\n", + "We solve these equations over a 1 by 1 square domain with no-flux boundary conditions." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "956a0fd1", + "metadata": {}, + "source": [ + "We begin with the necessary imports:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc398816", + "metadata": {}, + "outputs": [], + "source": [ + "import dolfin as d\n", + "import sympy as sym\n", + "import numpy as np\n", + "import pathlib\n", + "import gmsh # must be imported before pyvista if dolfin is imported first\n", + "\n", + "from smart import config, common, mesh, model, mesh_tools, visualization\n", + "from smart.units import unit\n", + "from smart.model_assembly import (\n", + " Compartment,\n", + " Parameter,\n", + " Reaction,\n", + " Species,\n", + " SpeciesContainer,\n", + " ParameterContainer,\n", + " CompartmentContainer,\n", + " ReactionContainer,\n", + ")\n", + "import logging\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "028bb85e", + "metadata": {}, + "source": [ + "We will set the logging level to `INFO`. This will display some output during the simulation. If you want to get even more output you could set the logging level to `DEBUG`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6e826d7", + "metadata": {}, + "outputs": [], + "source": [ + "logger = logging.getLogger(\"smart\")\n", + "logger.setLevel(logging.INFO)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "c7fd3be3", + "metadata": {}, + "source": [ + "Futhermore, you could also save the logs to a file by attaching a file handler to the logger as follows.\n", + "\n", + "```\n", + "file_handler = logging.FileHandler(\"filename.log\")\n", + "file_handler.setFormatter(logging.Formatter(smart.config.base_format))\n", + "logger.addHandler(file_handler)\n", + "```" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "95b9d865", + "metadata": {}, + "source": [ + "We define the various units for use in the model. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f4023cf", + "metadata": {}, + "outputs": [], + "source": [ + "# Aliases - base units\n", + "um = unit.um\n", + "molecule = unit.molecule\n", + "sec = unit.sec\n", + "dimensionless = unit.dimensionless\n", + "D_unit = um**2 / sec\n", + "flux_unit = molecule / (um * sec)\n", + "surf_unit = molecule / um**2\n", + "edge_unit = molecule / um" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "46582d26", + "metadata": {}, + "source": [ + "## Generate model\n", + "\n", + "### Compartments\n", + "As described above, the two compartments are the \"surf\" (2D) and edge (1D). These are initialized by calling:\n", + "```\n", + "compartment_var = Compartment(name, dimensionality, compartment_units, cell_marker)\n", + "```\n", + "where\n", + "- name: string naming the compartment\n", + "- dimensionality: topological dimensionality (e.g. 2 for surf, 1 for edge)\n", + "- compartment_units: length units for the compartment (um for both here)\n", + "- cell_marker: integer marker value identifying each compartment in the parent mesh" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09079b17", + "metadata": {}, + "outputs": [], + "source": [ + "surf = Compartment(\"surf\", 2, um, 1)\n", + "edge = Compartment(\"edge\", 1, um, 3)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "2db8daf9", + "metadata": {}, + "source": [ + "Now we initialize a compartment container and add both compartments to it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc3393cb", + "metadata": {}, + "outputs": [], + "source": [ + "cc = CompartmentContainer()\n", + "cc.add([surf, edge])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "8ee2332b", + "metadata": {}, + "source": [ + "### Species\n", + "In this case, we have a two species, \"A\" and \"B\", which exist in the 2D \"surf\" domain. Each is initialized by calling:\n", + "```\n", + "species_var = Species(\n", + " name, initial_condition, concentration_units,\n", + " D, diffusion_units, compartment_name, group (opt)\n", + " )\n", + "```\n", + "where\n", + "- name: string naming the species\n", + "- initial_condition: initial concentration for this species (can be an expression given by a string to be parsed by sympy - the only unknowns in the expression should be x, y, and z)\n", + "- concentration_units: concentration units for this species (molecules/μm2 here)\n", + "- D: diffusion coefficient\n", + "- diffusion_units: units for diffusion coefficient (μm2/sec here)\n", + "- compartment_name: each species should be assigned to a single compartment (\"surf\", here)\n", + "- group (opt): for larger models, specifies a group of species this belongs to;\n", + " for organizational purposes when there are multiple reaction modules\n", + "\n", + "With the added CH features, we also must provide the following for species A:\n", + "- `CH = True` - this tells SMART that we are considering both aggregation and diffusion for species A\n", + "- umax: maximum surface density of A\n", + "- A_hat: strength of aggregation\n", + "\n", + "Note that A_hat is dimensionless here and the chemical potential is a variable generated *internally* within this branch of SMART. Because only the nondimensional chemical potential appears in the dynamical equation for $u_A$, the chemical potential is always normalized to the thermal energy scale $k_B T$. (see equations up top for consistency on this point)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f6f384b", + "metadata": {}, + "outputs": [], + "source": [ + "A = Species(\"A\", 10, surf_unit, 0.1, D_unit, \"surf\", CH=True, umax=100, A_hat = 25) # CH species\n", + "B = Species(\"B\", 90, surf_unit, 0.1, D_unit, \"surf\") # other stuff" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "f77d2d31", + "metadata": {}, + "source": [ + "Create a species container and add both species to it:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c1df887", + "metadata": {}, + "outputs": [], + "source": [ + "sc = SpeciesContainer()\n", + "sc.add([A, B])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "74d1d353", + "metadata": {}, + "source": [ + "### Parameters and Reactions\n", + "Parameters and reactions are generally defined together, although the order does not strictly matter. Parameters are specified as:\n", + "```\n", + "param_var = Parameter(name, value, unit, group (opt), notes (opt), use_preintegration (opt))\n", + "```\n", + "where\n", + "- name: string naming the parameter\n", + "- value: value of the given parameter\n", + "- unit: units associated with given value\n", + "- group (optional): optional string placing this reaction in a reaction group; for organizational purposes when there are multiple reaction modules\n", + "- notes (optional): string related to this parameter\n", + "- use_preintegration (optional): in the case of a time-dependent parameter, uses preintegration in the solution process\n", + "\n", + "Reactions are specified by a variable number of arguments (arguments are indicated by (opt) are either never\n", + "required or only required in some cases, for more details see notes below and API documentation):\n", + "```\n", + "reaction_var = Reaction(\n", + " name, lhs, rhs, param_map,\n", + " eqn_f_str (opt), eqn_r_str (opt), reaction_type (opt), species_map,\n", + " explicit_restriction_to_domain (opt), group (opt), flux_scaling (opt)\n", + " )\n", + "```\n", + "- name: string naming the reaction\n", + "- lhs: list of strings specifying the reactants for this reaction\n", + "- rhs: list of strings specifying the products for this reaction\n", + " ***NOTE: the lists \"reactants\" and \"products\" determine the stoichiometry of the reaction;\n", + " for instance, if two A's react to give one B, the reactants list would be [\"A\",\"A\"],\n", + " and the products list would be [\"B\"]\n", + "- param_map: relationship between the parameters specified in the reaction string and those given\n", + " in the parameter container. By default, the reaction parameters are \"kon\" and \"koff\" when\n", + " a system obeys simple mass action. If the forward rate is given by a parameter \"k1\" and the\n", + " reverse rate is given by \"k2\", then param_map = {\"on\":\"k1\", \"off\":\"k2\"}\n", + "- eqn_f_str: For systems not obeying simple mass action, this string specifies the forward reaction rate\n", + " By default, this string is \"on*{all reactants multiplied together}\"\n", + "- eqn_r_str: For systems not obeying simple mass action, this string specifies the reverse reaction rate\n", + " By default, this string is \"off*{all products multiplied together}\"\n", + "- reaction_type (opt): either \"custom\" or \"mass_action\" (default is \"mass_action\") [never a required argument]\n", + "- species_map: same format as param_map; required if other species not listed in reactants or products appear in the\n", + " reaction string\n", + "- explicit_restriction_to_domain: string specifying where the reaction occurs; required if the reaction is not\n", + " constrained by the reaction string (e.g., if production occurs only at the boundary,\n", + " as it does here, but the species being produced exists through the entire volume)\n", + "- group (opt): string placing this reaction in a reaction group; for organizational purposes when there are multiple reaction modules\n", + "- flux_scaling (opt): in certain cases, a given reactant or product may experience a scaled flux (for instance, if we assume that\n", + " some of the molecules are immediately sequestered after the reaction); in this case, to signify that this flux \n", + " should be rescaled, we specify ''flux_scaling = {scaled_species: scale_factor}'', where scaled_species is a\n", + " string specifying the species to be scaled and scale_factor is a number specifying the rescaling factor\n", + "\n", + "For this system, we do not define any reactions on the boundary (`edge`). This corresponds to assuming a no-flux boundary condition." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df027853", + "metadata": {}, + "outputs": [], + "source": [ + "kon = Parameter(\"kon\", 10.0, 1/sec)\n", + "koff = Parameter(\"koff\", 1.0, 1/sec)\n", + "# Production of A\n", + "r1 = Reaction(\"r1\", [\"A\"], [\"B\"],\n", + " param_map={\"kon\": \"kon\", \"koff\": \"koff\"},\n", + " eqn_f_str=\"A*kon - B*koff\",\n", + " species_map={\"A\": \"A\", \"B\": \"B\"})" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "a0670e78", + "metadata": {}, + "source": [ + "Create parameter and reaction containers and add in associated objects." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1eb19fb6", + "metadata": {}, + "outputs": [], + "source": [ + "pc = ParameterContainer()\n", + "pc.add([kon, koff])\n", + "rc = ReactionContainer()\n", + "rc.add([r1])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "15c35d39", + "metadata": {}, + "source": [ + "## Create/load in mesh\n", + "\n", + "In SMART we have different levels of meshes. Here we create a UnitSquare mesh defined by\n", + "\n", + "$$\n", + "\\Omega = [0, 1] \\times [0, 1] \\subset \\mathbb{R}^2\n", + "$$\n", + "\n", + "which will serve as our parent mesh\n", + "\n", + "For our two domains, we have two associated \"child meshes\", which are set by the marker functions `mf2` and `mf1`:\n", + "- surf: in this case, all cells (triangles) belong to this mesh; here, marked by `mf2 = 1`\n", + "- edge: 1D child mesh including all line elements along the edges of the domain; here, marked by `mf1 = 3`\n", + "\n", + "Note that the marker values must be chosen to match those given in the compartment definitions above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe56e162", + "metadata": {}, + "outputs": [], + "source": [ + "# define dimensions of domain\n", + "Shat = 200\n", + "x_size = np.sqrt(Shat/A.umax)\n", + "y_size = np.sqrt(Shat/A.umax)\n", + "# Create mesh\n", + "m = 30\n", + "n = int(x_size/y_size)*m\n", + "rect_mesh = d.RectangleMesh(d.Point(0.0, 0.0), d.Point(x_size, y_size), n, m)\n", + "mf2 = d.MeshFunction(\"size_t\", rect_mesh, 2, 1)\n", + "mf1 = d.MeshFunction(\"size_t\", rect_mesh, 1, 0)\n", + "class OuterEdge(d.SubDomain):\n", + " def inside(self, x, on_boundary):\n", + " return on_boundary\n", + "outerEdge = OuterEdge()\n", + "outerEdge.mark(mf1, 3)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "86c4b70c", + "metadata": {}, + "source": [ + "Now we write mesh and meshfunctions to file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe4d77ac", + "metadata": {}, + "outputs": [], + "source": [ + "mesh_folder = pathlib.Path(\"rect_mesh\")\n", + "mesh_folder.mkdir(exist_ok=True)\n", + "mesh_file = mesh_folder / \"rect_mesh.h5\"\n", + "mesh_tools.write_mesh(rect_mesh, mf1, mf2, mesh_file)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "173e5474", + "metadata": {}, + "source": [ + "Finally, we initialize the `mesh.ParentMesh` object, using the hdf5 file as input." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bcbd06cd", + "metadata": {}, + "outputs": [], + "source": [ + "parent_mesh = mesh.ParentMesh(\n", + " mesh_filename=str(mesh_file),\n", + " mesh_filetype=\"hdf5\",\n", + " name=\"parent_mesh\",\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "8f7ac819", + "metadata": {}, + "source": [ + "## Initialize model and solver\n", + "Now we are ready to set up the model. First we load the default configurations and set the solver config." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43170d20", + "metadata": {}, + "outputs": [], + "source": [ + "config_cur = config.Config()\n", + "config_cur.flags.update({\"allow_unused_components\": True})\n", + "config_cur.solver.update(\n", + " {\n", + " \"final_t\": 1.0,\n", + " \"initial_dt\": 1e-3,\n", + " \"time_precision\": 8,\n", + " \"attempt_timestep_restart_on_divergence\": True,\n", + " }\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "96783316", + "metadata": {}, + "source": [ + "We create the model object initialize the model using the `initialize` function found in the `smart.model` module. We then save the model information to a .pkl file for later reference.\n", + "\n", + "Note that we could later load the model information from the pickle file using the line:\n", + "```\n", + "model_cur = model.from_pickle(model_cur.pkl)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a86c7435", + "metadata": {}, + "outputs": [], + "source": [ + "model_cur = model.Model(pc, sc, cc, rc, config_cur, parent_mesh)\n", + "model_cur.initialize(initialize_solver=False)\n", + "model_cur.to_pickle('model_cur.pkl')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "c0d464e3", + "metadata": {}, + "source": [ + "We then perturb the initial conditions by adding white noise to the dolfin vectors associated with each species." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4c42042c", + "metadata": {}, + "outputs": [], + "source": [ + "# add white noise perturbation to initial conditions\n", + "for sp_str in (\"A\", \"B\"):\n", + " sp = model_cur.sc[sp_str]\n", + " u = model_cur.cc[sp.compartment_name].u[\"u\"]\n", + " indices = sp.dof_map\n", + " uvec = u.vector()\n", + " values = uvec.get_local()\n", + " cur_seed = ord(sp_str) # set seed for reproducibility\n", + " generator_cur = np.random.default_rng(cur_seed)\n", + " values[indices] = np.multiply(values[indices],\n", + " generator_cur.normal(1, 0.01, len(indices)))\n", + " uvec.set_local(values)\n", + " uvec.apply(\"insert\")\n", + " nvec = model_cur.cc[sp.compartment_name].u[\"n\"].vector()\n", + " nvec.set_local(values)\n", + " nvec.apply(\"insert\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "79fbfad4", + "metadata": {}, + "source": [ + " Finally, we initialize the variational problem and solver." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab27a38e", + "metadata": {}, + "outputs": [], + "source": [ + "model_cur.initialize_discrete_variational_problem_and_solver()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "b610b5b8", + "metadata": {}, + "source": [ + "## Solve the system and write output data\n", + "Now, we are ready to start the solution process. We store the initial conditions to output files and then solve the system at each time step using the `monolithic_solve` function. Once we pass the final time chosen above, we exit the loop." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce499ef3", + "metadata": {}, + "outputs": [], + "source": [ + "# Write initial condition(s) to file\n", + "results = dict()\n", + "result_folder = pathlib.Path(\"resultsRect\")\n", + "result_folder.mkdir(exist_ok=True)\n", + "for species_name, species in model_cur.sc.items:\n", + " results[species_name] = d.XDMFFile(\n", + " model_cur.mpi_comm_world, str(result_folder / f\"{species_name}.xdmf\")\n", + " )\n", + " results[species_name].parameters[\"flush_output\"] = True\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + "\n", + "# Set loglevel to warning in order not to pollute notebook output\n", + "logger.setLevel(logging.WARNING)\n", + "\n", + "# Solve\n", + "while True:\n", + " print(f\"Time is {model_cur.t}\")\n", + " # Solve the system\n", + " model_cur.monolithic_solve()\n", + " model_cur.adjust_dt()\n", + " # Save results for post processing\n", + " for species_name, species in model_cur.sc.items:\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + " # End if we've passed the final time\n", + " if model_cur.t >= model_cur.final_t:\n", + " break" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "vscode": { + "interpreter": { + "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/example1/model_cur.pkl b/examples/example1/model_cur.pkl new file mode 100644 index 0000000000000000000000000000000000000000..1b254aeb3c8809b6289c910d3dd1a373c8cc1264 GIT binary patch literal 1864 zcmbVNU2h{b6m8nHNxx~S7J)=5P*w%8sdzvFq-wWaMA?mqcKLckmNVmtO+5B=Y?t<7 zrR4$bM)Dix0sa9$fxp2ofp-KP&m?KuHyEiM&-JzMJ?Gwg^0fKWQERSxo`eJ6R5WM7 z&jr6y&=PCQN)x^b2iW8dzcAD)_{DQ79Sf)T_UnVb>6Ea+Hw&Tg+9pmFA{k0X&Ky-% z*vs%^@UO((PDT@EO{b7lsLpiTuRn^0$5-y%hF`7@I4flE8($%Uxv!Ol8!K_&+usMi z=@(rp5?g=zCBqV}((v#fJO($k`%XwJltIp!)HFIi3;k!|a~KAtc17Uxeo<-5Ok8a{ z!$?swB+3RQwE}2IeoGi)Mb1dd3Z_y9j3d7dqbUI9nzd~%bHXl)GTydX-$bUio?kaK zFQiZdl2S`U&+klpZrGdlvOpbnOioMN$#u#kp~kShFE0bwn$+gY=mv7z0B$VE4nIV2 zYgx%y4BXe!gr2Lb*Bt6B3%qrD_m8@8yvnIG{N*uI{8c{Bck%by zi0_T~>m&XKKHlu{{T_d-$8Ym@`JJ9)zGVuQ2oPC!3ur^h1eGM#1S@cP)iE!^n1IQe zWHbz_8*V0Z;M=*DEOC+rRC6U4NvW%r3=jWCi5)VZWa%3phts>i{T!cP{AMb$%o)U- zx%vwB6z%~(>ducbU%TyvMCTX)n66}GEip~#C?|uEWqLF_%PW+?TSp0aJ z20w`#{~;{@ls}jWP#0-#ZW>^k_Y82voBI9lc+9WO0FEWBI)*>+8!0+pMJB0?gWR3> zTQjaR^j>SDqizEOcvYR%gh@%z%tH)sx8bN?E*VW?S4^Y%`SQKs7bK4s-#8A`FO=ht z6MQUJiiAswD!V1V#1HwQ^Q+^=o9-yC_!&QQ7z61ph)IyT8dQhQdR+CKU!Mdg^_(pw z&RCrXzl-6OA`zC9%-9mz5_`yMlIk4F6UTZLO`8l!t$`!I%+3_a2%Mo($L~NO_wMYS z;EhqMH_K`hCtJ}qI`Sv6%DzP}1ZFf3Bk-{Ubg|iTW;n@&WOdiwDp^t+52vdRe;?9t z)4xX2GSaYE3N0X)F`I9d*$t z%=UA?8{bhR$8y97$Ym5DFO6lu;#VevpT;{L^*{Ul&tL!Y%QXEKBoi2WexuS;T#|^` zTA|zax2eVP!d6m?n~JIe7(s#pqyhj243dEi_E8!(sbo0@ Ha<20)Mgh%D literal 0 HcmV?d00001 diff --git a/examples/example9/example9.ipynb b/examples/example9/example9.ipynb new file mode 100644 index 0000000..4c6b7cc --- /dev/null +++ b/examples/example9/example9.ipynb @@ -0,0 +1,299 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "f65f18d7", + "metadata": {}, + "source": [ + "# Example 9: Advection-diffusion in the case of confined migration\n", + "Here, we consider the binding or uptake of a molecule in the case of confined migration. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc398816", + "metadata": {}, + "outputs": [], + "source": [ + "import dolfin as d\n", + "import sympy as sym\n", + "import numpy as np\n", + "import pathlib\n", + "import logging\n", + "import gmsh # must be imported before pyvista if dolfin is imported first\n", + "\n", + "from smart import config, mesh, model, mesh_tools, visualization\n", + "from smart.units import unit\n", + "from smart.model_assembly import (\n", + " Compartment,\n", + " Parameter,\n", + " Reaction,\n", + " Species,\n", + " SpeciesContainer,\n", + " ParameterContainer,\n", + " CompartmentContainer,\n", + " ReactionContainer,\n", + ")\n", + "\n", + "from matplotlib import pyplot as plt\n", + "import matplotlib.image as mpimg\n", + "from matplotlib import rcParams\n", + "\n", + "logger = logging.getLogger(\"smart\")\n", + "logger.setLevel(logging.INFO)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "95b9d865", + "metadata": {}, + "source": [ + "We define the relevant units here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f4023cf", + "metadata": {}, + "outputs": [], + "source": [ + "# Aliases - base units\n", + "uM = unit.uM\n", + "um = unit.um\n", + "molecule = unit.molecule\n", + "sec = unit.sec\n", + "dimensionless = unit.dimensionless\n", + "# Aliases - units used in model\n", + "D_unit = um**2 / sec\n", + "flux_unit = uM * um / sec\n", + "vol_unit = uM\n", + "surf_unit = molecule / um**2" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "46582d26", + "metadata": {}, + "source": [ + "## Model generation\n", + "\n", + "We define the compartments and species first, with their respective containers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02a000f2", + "metadata": {}, + "outputs": [], + "source": [ + "EC = Compartment(\"EC\", 2, um, 1)\n", + "Cyto = Compartment(\"Cyto\", 2, um, 2)\n", + "Tube = Compartment(\"Tube\", 1, um, 10)\n", + "PM = Compartment(\"PM\", 1, um, 12)\n", + " # vel=[\"0\",\"0\",\"100.0*[1-(x[0]**2 + x[1]**2//4)]\"])\n", + "\n", + "cc = CompartmentContainer()\n", + "cc.add([EC, Cyto, Tube, PM])\n", + "\n", + "A = Species(\"A\", 10.0, vol_unit, 1.0, D_unit, \"EC\")\n", + "Abound = Species(\"Abound\", 0.1, surf_unit, 0.1, D_unit, \"PM\")\n", + "B = Species(\"B\", 10.0, vol_unit, 0.1, D_unit, \"EC\")\n", + "Bcyto = Species(\"Bcyto\", 1.0, vol_unit, 0.1, D_unit, \"Cyto\")\n", + "sc = SpeciesContainer()\n", + "sc.add([A, Abound, B, Bcyto])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3c56e840", + "metadata": {}, + "source": [ + "Define parameters and reactions, then place in respective containers.\n", + "* r1: release of A from PM" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e1f6882", + "metadata": {}, + "outputs": [], + "source": [ + "# reactions at PM\n", + "kon = Parameter(\"kon\", 0.0, flux_unit/vol_unit)\n", + "koff = Parameter(\"koff\", 0.0, 1/sec)\n", + "r1 = Reaction(\"r1\", [\"A\"], [\"Abound\"],\n", + " param_map={\"on\":\"kon\",\"off\":\"koff\"},\n", + " eqn_f_str=\"on*A - off*Abound\",\n", + " explicit_restriction_to_domain=\"PM\")\n", + "kin = Parameter(\"kin\", 0.01, flux_unit/vol_unit)\n", + "kout = Parameter(\"kout\", 0.01, flux_unit/vol_unit)\n", + "r2 = Reaction(\"r2\", [\"B\"], [\"Bcyto\"],\n", + " param_map={\"kin\":\"kin\",\"kout\":\"kout\"},\n", + " eqn_f_str=\"kin*B - kout*Bcyto\",\n", + " explicit_restriction_to_domain=\"PM\")\n", + "\n", + "pc = ParameterContainer()\n", + "pc.add([kon, koff, kin, kout])\n", + "rc = ReactionContainer()\n", + "rc.add([r1,r2])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "15c35d39", + "metadata": {}, + "source": [ + "## Create and load in mesh\n", + "\n", + "Here, we consider cells embedded in a cube mesh. The source cell is located at (0,0,0) and 8 other cells are spread equidistant through the mesh." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe56e162", + "metadata": {}, + "outputs": [], + "source": [ + "tubeRad = 5.0\n", + "gapSize = 1.0\n", + "cellVol = 1200.0\n", + "hEdge = 0.4\n", + "hInnerEdge = 0.1\n", + "domain, facet_markers, cell_markers = mesh_tools.create_confined(tubeRad, gapSize, cellVol, hEdge, hInnerEdge)\n", + "# Write mesh and meshfunctions to file\n", + "mesh_folder = pathlib.Path(\"mesh\")\n", + "mesh_folder.mkdir(exist_ok=True)\n", + "mesh_path = mesh_folder / \"cyl_mesh.h5\"\n", + "mesh_tools.write_mesh(\n", + " domain, facet_markers, cell_markers, filename=mesh_path\n", + ")\n", + "parent_mesh = mesh.ParentMesh(\n", + " mesh_filename=str(mesh_path),\n", + " mesh_filetype=\"hdf5\",\n", + " name=\"parent_mesh\",\n", + ")\n", + "# visualization.plot_dolfin_mesh(domain, cell_markers, facet_markers)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "0943588e", + "metadata": {}, + "source": [ + "Initialize model and solver." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac88bdec", + "metadata": {}, + "outputs": [], + "source": [ + "config_cur = config.Config()\n", + "config_cur.flags.update({\"allow_unused_components\": True})\n", + "config_cur.flags.update({\"axisymmetric_model\": True})\n", + "model_cur = model.Model(pc, sc, cc, rc, config_cur, parent_mesh)\n", + "config_cur.solver.update(\n", + " {\n", + " \"final_t\": 1000.0,\n", + " \"initial_dt\": 0.01,\n", + " \"time_precision\": 8,\n", + " \"reset_timestep_for_negative_solution\": False,\n", + " }\n", + ")\n", + "model_cur.initialize()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5d5aacbd", + "metadata": {}, + "source": [ + "Initialize XDMF files for saving results, save model information to .pkl file, then solve the system until `model_cur.t > model_cur.final_t`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b54d28ca", + "metadata": {}, + "outputs": [], + "source": [ + "# Write initial condition(s) to file\n", + "results = dict()\n", + "result_folder = pathlib.Path(f\"results_largeGap\")\n", + "result_folder.mkdir(exist_ok=True)\n", + "for species_name, species in model_cur.sc.items:\n", + " results[species_name] = d.XDMFFile(\n", + " model_cur.mpi_comm_world, str(result_folder / f\"{species_name}.xdmf\")\n", + " )\n", + " results[species_name].parameters[\"flush_output\"] = True\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + "model_cur.to_pickle(\"model_cur.pkl\")\n", + "\n", + "# Set loglevel to warning in order not to pollute notebook output\n", + "logger.setLevel(logging.WARNING)\n", + "# Solve\n", + "displayed = False\n", + "while True:\n", + " # Solve the system\n", + " model_cur.monolithic_solve()\n", + " model_cur.adjust_dt()\n", + " # Save results for post processing\n", + " for species_name, species in model_cur.sc.items:\n", + " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", + "\n", + " print(f\"Done with t={model_cur.t}\")\n", + " # End if we've passed the final time\n", + " if model_cur.t >= model_cur.final_t:\n", + " break\n", + "\n", + "# plt.plot(model_cur.tvec,)" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "vscode": { + "interpreter": { + "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/example9/model_cur.pkl b/examples/example9/model_cur.pkl new file mode 100644 index 0000000000000000000000000000000000000000..a0e397017efbc3f253716434674dc2941648509e GIT binary patch literal 2388 zcmcImOK%)S5caOu_BwW)#IX`7hY%nH6Di9>LfrB)U=oWZJaa;=-kF}Q#`DTdcgQ9} z3KA$;QGp;jLgCE;<$%P66F-N4z%Ky4p4qiG4i{cKvUj?=y1MGCs;~BX>(06Psp|8d zTjf?N6Xkfy@vdAJcsHsj-P>*zo7CXx%`A01b6Lh#x%K+k)D*XDs*U4Tu2Xz13!COT z*o>99WMyi!8Mx0JAM(4MNCwK3ojjI0?QCuH?h9V<>bCkugXgOQ*67&r(wn%UT+31e zHC4dg6Yo3P!!tJ2fvK0PyerW`kyTDR7?>?pkfotJ{|7!6f_Bg9*yyxG3{jj(fAEIu z-Egl#&@VEZJ8JSwni*C4w`E%@krxV%t9~JkM)X78r%PdUqC}{2m4*s24|y5FGDmRt zN!#Th5$Z}_cx!uVOJYmb<=v%B@>r*R5lSOnmsiF*JLD}h$dQ+oGLePpBw46pAfJ2VlFt1u6PRw;&E{{?BU^&y~3fG^(O*1=IlQQOj8P0>c{$WBv5ex*>Q! zgaOK;t{8L!O4sc~c3iAkEDIFtB*NTy-mRbdZDegvsH4c1xMIT6*7kO)Jd(}7K$7Y!Pb3Tt%A*`>T`sJ?wd_gbm^m3KkNfxWX#tKf-f%CuDt+bt|SGG@I z@TdQVXY>{~FT6bI$QZ&cN6z`)qU7U<`gzA5J0k_r$Cac3xyf}gOxLl|~7kMcJ zXQV!lGWL|X(d2y-x)aF-(Ay1&_PDP$76KK=0yMA*8r*2qtxT2%NdDDP`mR-|UEiql z+n^A;jR$rYt>XDY$-tNIwyWGMo_0JPlNWL0jFUWF)Qj0Oz0878CAir$4&2BcxP+Ui zf12g#icg-hyfA8)u>#%3bBk_SFi~u;h%x{MY2Tlv+g-ZVwY+=miKwY=Hn641632(Z zpRo?K5rryE0lN3CU@{SA35J2AkQdNu!KSFk(vauXrBp-$%8vJ+IgXii#!;UaTj{ zXp0wLujFgBW;I>mJkLcM)hZ0g?UU0LA935y#4-gH-sHpn+YiXmC{hAhRT97sN~02t z#a&~b3}ItD1$bVD?;yJZ!Y(gWvlK=G?VH1GwE37cIG&qo%)(M$r5+R}koiy}fW895 z!v0azgqqNcvO=V)k5PRYUS=_VJ@}bzdw$@{K4|!7UU<>J?F{vxjN|NGbRpskLF-AL lr9j_@xttgH1t4&3FGKJ;jWRDCRf+O7DXNi-g6Ub?`4hmVj$;4- literal 0 HcmV?d00001 diff --git a/smart/mesh_tools.py b/smart/mesh_tools.py index e3b7335..5eb5412 100644 --- a/smart/mesh_tools.py +++ b/smart/mesh_tools.py @@ -582,6 +582,215 @@ def meshSizeCallback(dim, tag, x, y, z, lc): return (dmesh, mf2, mf3) +def create_confined( + tubeRad: float = 10.0, + gapSize: float = 1.0, + cellVol: float = 1200.0, + hEdge: float = 0, + hInnerEdge: float = 0, + interface_marker: int = 12, + outer_marker: int = 10, + inner_vol_tag: int = 2, + outer_vol_tag: int = 1, + comm: MPI.Comm = d.MPI.comm_world, + verbose: bool = False, +) -> Tuple[d.Mesh, d.MeshFunction, d.MeshFunction]: + """ + Creates an axisymmetric mesh representing a cell within a cylindrical tube, + assuming axisymmetry about the r=0 axis. + + Args: + tubeRad: Radius of tube + gapSize: Gap between cell and tube wall + cellVol: volume of cell (constrains overall geometry) + hEdge: maximum mesh size at the outer edge + hInnerEdge: maximum mesh size at the edge + of the inner compartment + interface_marker: The value to mark facets on the interface with + outer_marker: The value to mark facets on the outer ellipsoid with + inner_vol_tag: The value to mark the inner ellipsoidal volume with + outer_vol_tag: The value to mark the outer ellipsoidal volume with + comm: MPI communicator to create the mesh with + verbose: If true print gmsh output, else skip + Returns: + Tuple (mesh, facet_marker, cell_marker) + """ + import gmsh + + if tubeRad <= 0: + raise ValueError("Tube radius must be greater than 0") + if gapSize <= 0 or gapSize >= tubeRad: + raise ValueError("Gap between cell membrane and wall must be between 0 and tubeRad") + if cellVol <= 0: + raise ValueError("Cell volume must be greater than 0") + + Lc = (cellVol - 4 * np.pi * (tubeRad - gapSize) ** 2) / (2 * np.pi * (tubeRad - gapSize)) + zmax = Lc / 2 + (tubeRad - gapSize) + 10.0 + rValsOuter = np.array([0.0, tubeRad, tubeRad, 0.0]) + zValsOuter = np.array([zmax, zmax, -zmax, -zmax]) + thetaVals = np.linspace(np.pi / 2, 0.0, 20) + rValsSphere = (tubeRad - gapSize) * np.cos(thetaVals) + zValsSphere = Lc / 2 + (tubeRad - gapSize) * np.sin(thetaVals) + maxOuterDim = zmax + maxInnerDim = Lc + (tubeRad - gapSize) + + if np.isclose(hEdge, 0): + hEdge = 0.1 * maxOuterDim + if np.isclose(hInnerEdge, 0): + hInnerEdge = 0.2 * maxInnerDim + # Create the two axisymmetric body mesh using gmsh + gmsh.initialize() + gmsh.option.setNumber("General.Terminal", int(verbose)) + gmsh.model.add("axisymm") + # first add outer body + outer_tag_list = [] + outer_line_list = [] + for i in range(len(rValsOuter)): + cur_tag = gmsh.model.occ.add_point(rValsOuter[i], 0, zValsOuter[i]) + outer_tag_list.append(cur_tag) + if i > 0: + outer_line_list.append(gmsh.model.occ.add_line(cur_tag, outer_tag_list[-2])) + # include symm axis + outer_line_list.append(gmsh.model.occ.add_line(outer_tag_list[0], outer_tag_list[-1])) + outer_loop_tag = gmsh.model.occ.add_curve_loop(outer_line_list) + cell_plane_tag = gmsh.model.occ.add_plane_surface([outer_loop_tag]) + + # Add inner shape + inner_tag_list1 = [] + for i in range(len(rValsSphere)): + cur_tag = gmsh.model.occ.add_point(rValsSphere[i], 0, zValsSphere[i]) + inner_tag_list1.append(cur_tag) + inner_spline1_tag = gmsh.model.occ.add_spline(inner_tag_list1) + inner_tag_list2 = [] + for i in range(len(rValsSphere)): + cur_tag = gmsh.model.occ.add_point(rValsSphere[-(i + 1)], 0, -zValsSphere[-(i + 1)]) + inner_tag_list2.append(cur_tag) + inner_spline2_tag = gmsh.model.occ.add_spline(inner_tag_list2) + inner_cyl_line = gmsh.model.occ.add_line(inner_tag_list1[-1], inner_tag_list2[0]) + symm_inner_tag = gmsh.model.occ.add_line(inner_tag_list1[0], inner_tag_list2[-1]) + inner_loop_tag = gmsh.model.occ.add_curve_loop( + [inner_spline1_tag, inner_cyl_line, inner_spline2_tag, symm_inner_tag] + ) + inner_plane_tag = gmsh.model.occ.add_plane_surface([inner_loop_tag]) + cell_plane_list = [cell_plane_tag] + inner_plane_list = [inner_plane_tag] + + outer_volume = [] + inner_volume = [] + all_volumes = [] + inner_marker_list = [] + outer_marker_list = [] + for i in range(len(cell_plane_list)): + cell_plane_tag = cell_plane_list[i] + inner_plane_tag = inner_plane_list[i] + # Create interface between 2 objects + two_shapes, (outer_shape_map, inner_shape_map) = gmsh.model.occ.fragment( + [(2, cell_plane_tag)], [(2, inner_plane_tag)] + ) + gmsh.model.occ.synchronize() + + # Get the outer boundary + outer_shell = gmsh.model.getBoundary(two_shapes, oriented=False) + for i in range(len(outer_shell)): + outer_marker_list.append(outer_shell[i][1]) + # Get the inner boundary + inner_shell = gmsh.model.getBoundary(inner_shape_map, oriented=False) + for i in range(len(inner_shell)): + inner_marker_list.append(inner_shell[i][1]) + for tag in outer_shape_map: + all_volumes.append(tag[1]) + for tag in inner_shape_map: + inner_volume.append(tag[1]) + + for vol in all_volumes: + if vol not in inner_volume: + outer_volume.append(vol) + + # Add physical markers for facets + # set symmetry axis to 0 (no flux) + xmin, ymin, zmin = (-hInnerEdge / 10, -hInnerEdge / 10, -1) + xmax, ymax, zmax = (hInnerEdge / 10, hInnerEdge / 10, max(zValsOuter) + 1) + all_symm_bound = gmsh.model.occ.get_entities_in_bounding_box( + xmin, ymin, zmin, xmax, ymax, zmax, dim=1 + ) + symm_bound_markers = [] + for i in range(len(all_symm_bound)): + symm_bound_markers.append(all_symm_bound[i][1]) + # note that this first call sets the symmetry axis to tag 0 and + # this is not overwritten by the next calls to add_physical_group + gmsh.model.add_physical_group(1, symm_bound_markers, tag=0) + gmsh.model.add_physical_group(1, outer_marker_list, tag=outer_marker) + gmsh.model.add_physical_group(1, inner_marker_list, tag=interface_marker) + + # Physical markers for "volumes" + gmsh.model.add_physical_group(2, outer_volume, tag=outer_vol_tag) + gmsh.model.add_physical_group(2, inner_volume, tag=inner_vol_tag) + + def meshSizeCallback(dim, tag, x, y, z, lc): + # mesh length is hEdge at the PM and hInnerEdge at the inner membrane + # between these, the value is interpolated based on the relative distance + # between the two membranes. + # Inside the inner shape, the value is interpolated between hInnerEdge + # and lc3, where lc3 = max(hInnerEdge, 0.2*maxInnerDim) + # if innerRad=0, then the mesh length is interpolated between + # hEdge at the PM and 0.2*maxOuterDim in the center + lc1 = hEdge + lc2 = hInnerEdge + lc3 = max(hInnerEdge, 0.3 * (tubeRad - gapSize)) + z_abs = np.abs(z) + if z_abs < Lc / 2: + if x > (tubeRad - gapSize): + in_outer = True + # dist_to_outer = tubeRad - x + dist_to_inner = x - (tubeRad - gapSize) + else: + in_outer = False + R_rel_inner = x / (tubeRad - gapSize) + else: + rTest = np.sqrt(x**2 + (z_abs - Lc / 2) ** 2) + if rTest > (tubeRad - gapSize): + in_outer = True + # dist_to_outer = tubeRad - x + dist_to_inner = rTest - (tubeRad - gapSize) + else: + in_outer = False + R_rel_inner = rTest / (tubeRad - gapSize) + + if in_outer: + lcTest = lc2 + (lc1 - lc2) * (1 - np.exp(-dist_to_inner / 1.0)) + else: + lcTest = lc2 + (lc3 - lc2) * (1 - R_rel_inner) + return lcTest + + gmsh.model.mesh.setSizeCallback(meshSizeCallback) + # set off the other options for mesh size determination + gmsh.option.setNumber("Mesh.MeshSizeExtendFromBoundary", 0) + gmsh.option.setNumber("Mesh.MeshSizeFromPoints", 0) + gmsh.option.setNumber("Mesh.MeshSizeFromCurvature", 0) + # this changes the algorithm from Frontal-Delaunay to Delaunay, + # which may provide better results when there are larger gradients in mesh size + gmsh.option.setNumber("Mesh.Algorithm", 5) + + gmsh.model.mesh.generate(2) + rank = MPI.COMM_WORLD.rank + tmp_folder = pathlib.Path(f"tmp_2DCell_{rank}") + tmp_folder.mkdir(exist_ok=True) + gmsh_file = tmp_folder / "2DCell.msh" + gmsh.write(str(gmsh_file)) + gmsh.finalize() + + # return dolfin mesh of max dimension (parent mesh) and marker functions mf2 and mf3 + dmesh, mf2, mf3 = gmsh_to_dolfin(str(gmsh_file), tmp_folder, 2, comm) + # ensure zero flux condition at r=0 axis + for f in d.facets(dmesh): + if np.isclose(f.midpoint().x(), 0.0): + mf2[f] = 0 + # remove tmp mesh and tmp folder + gmsh_file.unlink(missing_ok=False) + tmp_folder.rmdir() + return (dmesh, mf2, mf3) + + def create_cylinders( outerRad: float = 1.0, innerRad: float = 0.0, diff --git a/smart/model.py b/smart/model.py index 7964faf..0360051 100644 --- a/smart/model.py +++ b/smart/model.py @@ -255,6 +255,7 @@ def _init_1(self): logger.debug("Checking validity of model (step 1 of ZZ)", extra=dict(format_type="title")) self._init_1_1_check_mesh_dimensionality() + self._init_1_1b_CH_chem_potential_init() self._init_1_2_check_namespace_conflicts() self._init_1_3_check_parameter_dimensionality() logger.debug( @@ -372,6 +373,28 @@ def _init_1_1_check_mesh_dimensionality(self): for compartment in self.cc: compartment.is_volume = compartment.dimensionality == self.max_dim + def _init_1_1b_CH_chem_potential_init(self): + # all CH species require an additional species to be added to track chemical potential + # initial value is treated later + new_sp = [] + for species in self.sc: + if species.CH: + init_chem_potential = 0.0 + diff_units = self.cc[species.compartment_name].compartment_units ** 2 / unit.sec + chem_potential_sp = Species( + f"{species.name}_chem_potential", + init_chem_potential, + unit.dimensionless, + 0.0, + diff_units, + species.compartment_name, + ) + chem_potential_sp.is_chem_potential = True + new_sp.append(chem_potential_sp) + species.chem_potential = chem_potential_sp + for sp in new_sp: + self.sc.add(sp) + def _init_1_2_check_namespace_conflicts(self): """Namespace checks: @@ -584,6 +607,9 @@ def _init_2_4_check_for_unused_parameters_species_compartments(self): all_parameters = set(chain.from_iterable([r.parameters for r in self.rc])) all_species = set(chain.from_iterable([r.species for r in self.rc])) + for species in self.sc: + if species.is_chem_potential: + all_species.add(species.name) all_compartments = set(chain.from_iterable([r.compartments for r in self.rc])) if all_parameters != set(self.pc.keys): print_str = ( @@ -987,6 +1013,9 @@ def _init_4_7_set_initial_conditions(self): """ logger.debug("Set function values to initial conditions", extra=dict(format_type="log")) for species in self.sc: + if species.is_chem_potential: + species.D_dolfin = d.Constant(0.0) # set diffusion to zero (N/A) + continue # then initial condition is set to match concentration of assoc species # first, initialize diffusion coefficient if isinstance(species.D, float): species.D_dolfin = d.Constant(species.D) @@ -1024,6 +1053,21 @@ def _init_4_7_set_initial_conditions(self): values[species.dof_map] = values_new[species.dof_map] u_cur.vector().set_local(values) u_cur.vector().apply("insert") + if species.CH: + lagrange = species.compartment.deform_logic or species.alt_deform_logic + if lagrange: + logger.error("CH species are not compatible with Lagrange approach yet!") + for ckey in species.chem_potential.u.keys(): + A_hat = species.A_hat + phi_cur = species.u[ckey] / species.umax + cfunc = ( + d.ln(phi_cur) + - d.ln(1 - phi_cur) + - A_hat * (2 * phi_cur - 1) + + (A_hat / species.umax) * d.div(d.grad(phi_cur)) + ) + Vc = species.chem_potential.V + species.chem_potential.u[ckey].assign(d.project(cfunc, Vc)) species.alt_vel_logic = np.any([vel != 0.0 for vel in species.alt_vel]) species.alt_deform_logic = np.any([deform != 0.0 for deform in species.alt_deform]) if species.alt_vel_logic and species.alt_deform_logic: @@ -1339,8 +1383,53 @@ def _init_5_2_create_variational_forms(self): J = d.Constant(1.0) if self.config.flags["axisymmetric_model"]: J = x[0] * J + # catch CH case + if species.CH: + if species.is_chem_potential: + logger.debug( + "Chemical potential equation is defined with concentration," + "skipping to next species" + ) + continue + else: + u_c = species.chem_potential._usplit["u"] + v_c = species.chem_potential.v + A_hat = species.A_hat + phi_cur = u / species.umax + df_c = d.ln(phi_cur) - d.ln(1 - phi_cur) - A_hat * (2 * phi_cur - 1) + CForm = J * ( + (u_c - df_c) * v_c * dx + - (A_hat / species.umax) * d.inner(d.grad(phi_cur), d.grad(v_c)) * dx + ) + CForm_units = ( + species.compartment.compartment_units**species.compartment.dimensionality + ) + # chemical potential is in units of kBT for convenience + Dform = J * D * u * d.inner(d.grad(u_c), d.grad(v)) * dx + self.forms.add( + Form( + f"chem_potential_{species.name}", + CForm, + species.chem_potential, + "chem_potential", + CForm_units, + True, + linear_wrt_comp, + ) + ) + self.forms.add( + Form( + f"diffusion_{species.name}", + Dform, + species, + "diffusion", + Dform_units, + True, + linear_wrt_comp, + ) + ) # diffusion term - if species.D == 0: + elif species.D == 0: logger.debug( f"Species {species.name} has a diffusion coefficient of 0. " "Skipping creation of diffusive form.", @@ -1368,8 +1457,6 @@ def _init_5_2_create_variational_forms(self): ) else: Dform = J * D * d.inner(d.grad(u), d.grad(v)) * dx - # exponent is -2 because of two gradients - self.forms.add( Form( f"diffusion_{species.name}", diff --git a/smart/model_assembly.py b/smart/model_assembly.py index 55abd2b..ffa79e5 100644 --- a/smart/model_assembly.py +++ b/smart/model_assembly.py @@ -988,6 +988,11 @@ class Species(ObjectInstance): alt_deform: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) alt_vel: list = dataclasses.field(default_factory=lambda: [0.0, 0.0, 0.0]) alt_manual_update: bool = False + CH: bool = False + is_chem_potential: bool = False + A_hat: float = 0.0 + umax: float = 0.0 + # if this is a CH conc, then we also need fields: chem_potential, A_hat, umax def to_dict(self): "Convert to a dict that can be used to recreate the object." @@ -1061,6 +1066,12 @@ def __post_init__(self): else: raise TypeError("Diffusion coefficient must a float, int, or string") + if self.CH: + if not hasattr(self, "A_hat"): + raise ValueError("A_hat must be provided for CH species") + if not hasattr(self, "umax"): + raise ValueError("umax must be provided for CH variable") + self._convert_pint_quantity_to_unit() self._check_input_type_validity() self._convert_pint_unit_to_quantity() From 4fc9878d14f28ee0ae6596ab37a93e98cea100cc Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:21:20 -0700 Subject: [PATCH 22/25] remove pkl files --- examples/example1/model_cur.pkl | Bin 1864 -> 0 bytes examples/example9/model_cur.pkl | Bin 2388 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/example1/model_cur.pkl delete mode 100644 examples/example9/model_cur.pkl diff --git a/examples/example1/model_cur.pkl b/examples/example1/model_cur.pkl deleted file mode 100644 index 1b254aeb3c8809b6289c910d3dd1a373c8cc1264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmbVNU2h{b6m8nHNxx~S7J)=5P*w%8sdzvFq-wWaMA?mqcKLckmNVmtO+5B=Y?t<7 zrR4$bM)Dix0sa9$fxp2ofp-KP&m?KuHyEiM&-JzMJ?Gwg^0fKWQERSxo`eJ6R5WM7 z&jr6y&=PCQN)x^b2iW8dzcAD)_{DQ79Sf)T_UnVb>6Ea+Hw&Tg+9pmFA{k0X&Ky-% z*vs%^@UO((PDT@EO{b7lsLpiTuRn^0$5-y%hF`7@I4flE8($%Uxv!Ol8!K_&+usMi z=@(rp5?g=zCBqV}((v#fJO($k`%XwJltIp!)HFIi3;k!|a~KAtc17Uxeo<-5Ok8a{ z!$?swB+3RQwE}2IeoGi)Mb1dd3Z_y9j3d7dqbUI9nzd~%bHXl)GTydX-$bUio?kaK zFQiZdl2S`U&+klpZrGdlvOpbnOioMN$#u#kp~kShFE0bwn$+gY=mv7z0B$VE4nIV2 zYgx%y4BXe!gr2Lb*Bt6B3%qrD_m8@8yvnIG{N*uI{8c{Bck%by zi0_T~>m&XKKHlu{{T_d-$8Ym@`JJ9)zGVuQ2oPC!3ur^h1eGM#1S@cP)iE!^n1IQe zWHbz_8*V0Z;M=*DEOC+rRC6U4NvW%r3=jWCi5)VZWa%3phts>i{T!cP{AMb$%o)U- zx%vwB6z%~(>ducbU%TyvMCTX)n66}GEip~#C?|uEWqLF_%PW+?TSp0aJ z20w`#{~;{@ls}jWP#0-#ZW>^k_Y82voBI9lc+9WO0FEWBI)*>+8!0+pMJB0?gWR3> zTQjaR^j>SDqizEOcvYR%gh@%z%tH)sx8bN?E*VW?S4^Y%`SQKs7bK4s-#8A`FO=ht z6MQUJiiAswD!V1V#1HwQ^Q+^=o9-yC_!&QQ7z61ph)IyT8dQhQdR+CKU!Mdg^_(pw z&RCrXzl-6OA`zC9%-9mz5_`yMlIk4F6UTZLO`8l!t$`!I%+3_a2%Mo($L~NO_wMYS z;EhqMH_K`hCtJ}qI`Sv6%DzP}1ZFf3Bk-{Ubg|iTW;n@&WOdiwDp^t+52vdRe;?9t z)4xX2GSaYE3N0X)F`I9d*$t z%=UA?8{bhR$8y97$Ym5DFO6lu;#VevpT;{L^*{Ul&tL!Y%QXEKBoi2WexuS;T#|^` zTA|zax2eVP!d6m?n~JIe7(s#pqyhj243dEi_E8!(sbo0@ Ha<20)Mgh%D diff --git a/examples/example9/model_cur.pkl b/examples/example9/model_cur.pkl deleted file mode 100644 index a0e397017efbc3f253716434674dc2941648509e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 zcmcImOK%)S5caOu_BwW)#IX`7hY%nH6Di9>LfrB)U=oWZJaa;=-kF}Q#`DTdcgQ9} z3KA$;QGp;jLgCE;<$%P66F-N4z%Ky4p4qiG4i{cKvUj?=y1MGCs;~BX>(06Psp|8d zTjf?N6Xkfy@vdAJcsHsj-P>*zo7CXx%`A01b6Lh#x%K+k)D*XDs*U4Tu2Xz13!COT z*o>99WMyi!8Mx0JAM(4MNCwK3ojjI0?QCuH?h9V<>bCkugXgOQ*67&r(wn%UT+31e zHC4dg6Yo3P!!tJ2fvK0PyerW`kyTDR7?>?pkfotJ{|7!6f_Bg9*yyxG3{jj(fAEIu z-Egl#&@VEZJ8JSwni*C4w`E%@krxV%t9~JkM)X78r%PdUqC}{2m4*s24|y5FGDmRt zN!#Th5$Z}_cx!uVOJYmb<=v%B@>r*R5lSOnmsiF*JLD}h$dQ+oGLePpBw46pAfJ2VlFt1u6PRw;&E{{?BU^&y~3fG^(O*1=IlQQOj8P0>c{$WBv5ex*>Q! zgaOK;t{8L!O4sc~c3iAkEDIFtB*NTy-mRbdZDegvsH4c1xMIT6*7kO)Jd(}7K$7Y!Pb3Tt%A*`>T`sJ?wd_gbm^m3KkNfxWX#tKf-f%CuDt+bt|SGG@I z@TdQVXY>{~FT6bI$QZ&cN6z`)qU7U<`gzA5J0k_r$Cac3xyf}gOxLl|~7kMcJ zXQV!lGWL|X(d2y-x)aF-(Ay1&_PDP$76KK=0yMA*8r*2qtxT2%NdDDP`mR-|UEiql z+n^A;jR$rYt>XDY$-tNIwyWGMo_0JPlNWL0jFUWF)Qj0Oz0878CAir$4&2BcxP+Ui zf12g#icg-hyfA8)u>#%3bBk_SFi~u;h%x{MY2Tlv+g-ZVwY+=miKwY=Hn641632(Z zpRo?K5rryE0lN3CU@{SA35J2AkQdNu!KSFk(vauXrBp-$%8vJ+IgXii#!;UaTj{ zXp0wLujFgBW;I>mJkLcM)hZ0g?UU0LA935y#4-gH-sHpn+YiXmC{hAhRT97sN~02t z#a&~b3}ItD1$bVD?;yJZ!Y(gWvlK=G?VH1GwE37cIG&qo%)(M$r5+R}koiy}fW895 z!v0azgqqNcvO=V)k5PRYUS=_VJ@}bzdw$@{K4|!7UU<>J?F{vxjN|NGbRpskLF-AL lr9j_@xttgH1t4&3FGKJ;jWRDCRf+O7DXNi-g6Ub?`4hmVj$;4- From b0b0c67a592e5b9d86e16ea5ceea1e0be8aa6fc7 Mon Sep 17 00:00:00 2001 From: emmetfrancis <99422170+emmetfrancis@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:54:27 -0700 Subject: [PATCH 23/25] Implement cutoff and mass conservation in CH example --- .pre-commit-config.yaml | 3 +- examples/example1/example1_CH.ipynb | 186 ++++++++++++------- examples/example1/spheroid_ellipsoid_mesh.h5 | Bin 0 -> 2304688 bytes 3 files changed, 121 insertions(+), 68 deletions(-) create mode 100644 examples/example1/spheroid_ellipsoid_mesh.h5 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b9ff80d..9541779 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,8 @@ repos: exclude: | (?x)^( joss-paper/JOSS_Fig2.png| - examples/example2-3d/spine_mesh.xml + examples/example2-3d/spine_mesh.xml| + examples/example1/spheroid_ellipsoid_mesh.h5 )$ - id: check-docstring-first - id: debug-statements diff --git a/examples/example1/example1_CH.ipynb b/examples/example1/example1_CH.ipynb index 111a673..96e1af3 100644 --- a/examples/example1/example1_CH.ipynb +++ b/examples/example1/example1_CH.ipynb @@ -12,23 +12,24 @@ "- surf - 2D surface\n", "- edge - outer edges of the surface (1D)\n", "\n", - "We implement a Cahn-Hilliard model with two species, one exhibiting aggregation-diffusion ($A$) and the other purely diffusive ($B$).\n", + "We implement a Cahn-Hilliard model with two species, one exhibiting aggregation-diffusion ($B$) and the other purely diffusive ($X$).\n", "The equations governing their evolution are given by:\n", "\n", "$$\n", - "\\partial_t{u_A} = -k_{on} u_A + k_{off} u_B + D_A \\nabla \\cdot (\\hat{\\mu}_A \\nabla u_A) \\\\\n", - "\\partial_t{u_B} = k_{on} u_A - k_{off} u_B + D_B \\nabla \\cdot (\\nabla u_B),\n", + "\\partial_t{u_X} = -k_{on} u_X + k_{off} u_B + D_X \\nabla \\cdot (\\hat{\\mu}_X \\nabla u_X) \\\\\n", + "\\partial_t{u_B} = k_{on} u_X - k_{off} u_B + D_B \\nabla \\cdot (\\hat{\\mu}_B \\nabla u_B),\n", "$$\n", "\n", - "where aggregation is accounted for through the chemical potential of $A$, whose nondimensional version ($\\hat{\\mu}_A = \\frac{\\mu_A}{k_B T}) is given by\n", + "where aggregation is accounted for through the chemical potential of $B$, whose nondimensional version ($\\hat{\\mu}_B = \\frac{\\mu_B}{k_B T}$) is given by\n", "\n", "$$\n", - "\\hat{\\mu}_A = (\\ln \\phi_A - \\ln (1-\\phi_A)) - \\hat{A} (2 \\phi_A - 1) - \\hat{A} \\nabla^2 \\phi_A\n", + "\\hat{\\mu}_B = (\\ln \\phi_B - \\ln (1-\\phi_B)) - \\hat{A} (2 \\phi_B - 1) - \\frac{\\hat{A}}{u_{B,max}} \\nabla^2 \\phi_B\n", "$$\n", "\n", - "in which $\\phi_A$ is the area fraction occupied by species A, which is proportional to its concentration; that is, $\\phi_A = \\frac{u_A}{u_{A,max}}$\n", + "in which $\\phi_B$ is the area fraction occupied by species B, which is proportional to its concentration; that is, $\\phi_B = \\frac{u_B}{u_{B,max}}$.\n", + "The chemical potential is defined similarly for X, but with $\\hat{A}=0$; that is, $\\hat{\\mu}_X = (\\ln \\phi_X - \\ln (1-\\phi_X))$\n", "\n", - "We solve these equations over a 1 by 1 square domain with no-flux boundary conditions." + "We solve these equations over a square domain with no-flux boundary conditions." ] }, { @@ -158,8 +159,7 @@ "metadata": {}, "outputs": [], "source": [ - "surf = Compartment(\"surf\", 2, um, 1)\n", - "edge = Compartment(\"edge\", 1, um, 3)" + "surf = Compartment(\"surf\", 2, um, 10)" ] }, { @@ -179,7 +179,7 @@ "outputs": [], "source": [ "cc = CompartmentContainer()\n", - "cc.add([surf, edge])" + "cc.add([surf])" ] }, { @@ -189,7 +189,7 @@ "metadata": {}, "source": [ "### Species\n", - "In this case, we have a two species, \"A\" and \"B\", which exist in the 2D \"surf\" domain. Each is initialized by calling:\n", + "In this case, we have a two species, \"X\" and \"B\", which exist in the 2D \"surf\" domain. Each is initialized by calling:\n", "```\n", "species_var = Species(\n", " name, initial_condition, concentration_units,\n", @@ -206,9 +206,9 @@ "- group (opt): for larger models, specifies a group of species this belongs to;\n", " for organizational purposes when there are multiple reaction modules\n", "\n", - "With the added CH features, we also must provide the following for species A:\n", - "- `CH = True` - this tells SMART that we are considering both aggregation and diffusion for species A\n", - "- umax: maximum surface density of A\n", + "With the added CH features, we also must provide the following for Cahn-Hilliard type species:\n", + "- `CH = True` - this tells SMART that we are considering both aggregation and diffusion\n", + "- umax: maximum surface density of X or B\n", "- A_hat: strength of aggregation\n", "\n", "Note that A_hat is dimensionless here and the chemical potential is a variable generated *internally* within this branch of SMART. Because only the nondimensional chemical potential appears in the dynamical equation for $u_A$, the chemical potential is always normalized to the thermal energy scale $k_B T$. (see equations up top for consistency on this point)" @@ -221,8 +221,8 @@ "metadata": {}, "outputs": [], "source": [ - "A = Species(\"A\", 10, surf_unit, 0.1, D_unit, \"surf\", CH=True, umax=100, A_hat = 25) # CH species\n", - "B = Species(\"B\", 90, surf_unit, 0.1, D_unit, \"surf\") # other stuff" + "X = Species(\"X\", 10, surf_unit, 0.1, D_unit, \"surf\", CH=True, umax=100, A_hat = 0) \n", + "B = Species(\"B\", 90, surf_unit, 0.1, D_unit, \"surf\", CH=True, umax=100, A_hat = 25)" ] }, { @@ -242,7 +242,7 @@ "outputs": [], "source": [ "sc = SpeciesContainer()\n", - "sc.add([A, B])" + "sc.add([X, B])" ] }, { @@ -309,13 +309,13 @@ "metadata": {}, "outputs": [], "source": [ - "kon = Parameter(\"kon\", 10.0, 1/sec)\n", - "koff = Parameter(\"koff\", 1.0, 1/sec)\n", + "kon = Parameter(\"kon\", 0.0, 1/sec)\n", + "koff = Parameter(\"koff\", 0.0, 1/sec)\n", "# Production of A\n", - "r1 = Reaction(\"r1\", [\"A\"], [\"B\"],\n", + "r1 = Reaction(\"r1\", [\"X\"], [\"B\"],\n", " param_map={\"kon\": \"kon\", \"koff\": \"koff\"},\n", - " eqn_f_str=\"A*kon - B*koff\",\n", - " species_map={\"A\": \"A\", \"B\": \"B\"})" + " eqn_f_str=\"X*kon - B*koff\",\n", + " species_map={\"X\": \"X\", \"B\": \"B\"})" ] }, { @@ -370,43 +370,31 @@ "metadata": {}, "outputs": [], "source": [ - "# define dimensions of domain\n", - "Shat = 200\n", - "x_size = np.sqrt(Shat/A.umax)\n", - "y_size = np.sqrt(Shat/A.umax)\n", - "# Create mesh\n", - "m = 30\n", - "n = int(x_size/y_size)*m\n", - "rect_mesh = d.RectangleMesh(d.Point(0.0, 0.0), d.Point(x_size, y_size), n, m)\n", - "mf2 = d.MeshFunction(\"size_t\", rect_mesh, 2, 1)\n", - "mf1 = d.MeshFunction(\"size_t\", rect_mesh, 1, 0)\n", - "class OuterEdge(d.SubDomain):\n", - " def inside(self, x, on_boundary):\n", - " return on_boundary\n", - "outerEdge = OuterEdge()\n", - "outerEdge.mark(mf1, 3)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "86c4b70c", - "metadata": {}, - "source": [ - "Now we write mesh and meshfunctions to file." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fe4d77ac", - "metadata": {}, - "outputs": [], - "source": [ - "mesh_folder = pathlib.Path(\"rect_mesh\")\n", - "mesh_folder.mkdir(exist_ok=True)\n", - "mesh_file = mesh_folder / \"rect_mesh.h5\"\n", - "mesh_tools.write_mesh(rect_mesh, mf1, mf2, mesh_file)" + "useSpheroid = True\n", + "if useSpheroid:\n", + " vol = Compartment(\"vol\", 3, um, 1) # SMART just needs to know its a 3d mesh\n", + " cc.add(vol)\n", + " mesh_file = pathlib.Path(\"spheroid_ellipsoid_mesh.h5\")\n", + "else:\n", + " # define dimensions of domain\n", + " Shat = 200\n", + " x_size = np.sqrt(Shat/B.umax)\n", + " y_size = np.sqrt(Shat/B.umax)\n", + " # Create mesh\n", + " m = 30\n", + " n = int(x_size/y_size)*m\n", + " rect_mesh = d.RectangleMesh(d.Point(0.0, 0.0), d.Point(x_size, y_size), n, m)\n", + " mf2 = d.MeshFunction(\"size_t\", rect_mesh, 2, 10)\n", + " mf1 = d.MeshFunction(\"size_t\", rect_mesh, 1, 0)\n", + " class OuterEdge(d.SubDomain):\n", + " def inside(self, x, on_boundary):\n", + " return on_boundary\n", + " outerEdge = OuterEdge()\n", + " outerEdge.mark(mf1, 3)\n", + " mesh_folder = pathlib.Path(\"rect_mesh\")\n", + " mesh_folder.mkdir(exist_ok=True)\n", + " mesh_file = mesh_folder / \"rect_mesh.h5\"\n", + " mesh_tools.write_mesh(rect_mesh, mf1, mf2, mesh_file)" ] }, { @@ -483,7 +471,7 @@ "outputs": [], "source": [ "model_cur = model.Model(pc, sc, cc, rc, config_cur, parent_mesh)\n", - "model_cur.initialize(initialize_solver=False)\n", + "model_cur.initialize()\n", "model_cur.to_pickle('model_cur.pkl')" ] }, @@ -504,7 +492,7 @@ "outputs": [], "source": [ "# add white noise perturbation to initial conditions\n", - "for sp_str in (\"A\", \"B\"):\n", + "for sp_str in (\"X\", \"B\"):\n", " sp = model_cur.sc[sp_str]\n", " u = model_cur.cc[sp.compartment_name].u[\"u\"]\n", " indices = sp.dof_map\n", @@ -522,22 +510,59 @@ ] }, { - "attachments": {}, "cell_type": "markdown", - "id": "79fbfad4", + "id": "fbe592a7", "metadata": {}, "source": [ - " Finally, we initialize the variational problem and solver." + "Define other functions to be used for mass conservation and cutoffs here" ] }, { "cell_type": "code", "execution_count": null, - "id": "ab27a38e", + "id": "8aa0f4cf", "metadata": {}, "outputs": [], "source": [ - "model_cur.initialize_discrete_variational_problem_and_solver()" + "def _set_clipped_sum_c_tmp_scalar(sp, xi1_scalar, dt_val, epsilon):\n", + " \"\"\"clip(c + dt*xi_1) on all DOFs; xi_1 is a global scalar.\"\"\"\n", + " lo = sp.umax*(epsilon)\n", + " hi = sp.umax*(1.0 - epsilon)\n", + " c_tmp = d.Function(sp.V)\n", + " d.assign(c_tmp, sp.sol)\n", + " cvec = c_tmp.vector()[:]\n", + " cvec = np.clip(cvec + float(dt_val) * xi1_scalar, float(lo), float(hi))\n", + " c_tmp.vector().set_local(cvec)\n", + " c_tmp.vector().apply(\"insert\")\n", + " return c_tmp\n", + "\n", + "Xfunc = model_cur.sc[\"X\"].sol\n", + "Xdof = model_cur.sc[\"X\"].dof_map\n", + "Bfunc = model_cur.sc[\"B\"].sol\n", + "Bdof = model_cur.sc[\"B\"].dof_map\n", + "dx = d.Measure(\"dx\", model_cur.cc[\"surf\"].dolfin_mesh)\n", + "c_mass_init = d.assemble_mixed((Xfunc+Bfunc)*dx)\n", + "def F_mass(xi_arg1, epsilon, c_mass_init):\n", + " \"\"\"F(xi_1) = int clip(phi_X + dt*xi_1) + int clip(phi_B + dt*xi_1) minus previous X+B.\"\"\"\n", + " dt_val = float(model_cur.dt)\n", + " Xtemp = _set_clipped_sum_c_tmp_scalar(\n", + " model_cur.sc[\"X\"], xi_arg1, dt_val, epsilon)\n", + " Btemp = _set_clipped_sum_c_tmp_scalar(\n", + " model_cur.sc[\"B\"], xi_arg1, dt_val, epsilon)\n", + " dx = d.Measure(\"dx\", Xtemp.function_space().mesh())\n", + " mass_err = d.assemble_mixed((Xtemp+Btemp)*dx) - c_mass_init\n", + " return mass_err\n", + "\n", + "def assign_from_sub(subfunc, func, dofmap):\n", + " fullvec = func.vector()[:]\n", + " subvec = subfunc.vector()[:]\n", + " fullvec[dofmap] = subvec\n", + " func.vector().set_local(fullvec)\n", + " func.vector().apply(\"insert\")\n", + "\n", + "# check that the above functions are consistent\n", + "if F_mass(0.0, 0.01, c_mass_init) > 0.0:\n", + " raise ValueError(\"This should not be possible\")" ] }, { @@ -571,13 +596,40 @@ "# Set loglevel to warning in order not to pollute notebook output\n", "logger.setLevel(logging.WARNING)\n", "\n", + "epsilon = 0.01\n", + "xi_secant_max_iter = 500\n", + "\n", "# Solve\n", "while True:\n", " print(f\"Time is {model_cur.t}\")\n", " # Solve the system\n", " model_cur.monolithic_solve()\n", " model_cur.adjust_dt()\n", - " # Save results for post processing\n", + " # Secant on global scalar xi_1: initial guesses (0, -dt).\n", + " xi_secant_iter = 0\n", + " xi_guess_prev = 0.0\n", + " xi_guess = -float(model_cur.dt)\n", + " secant_tol = 1e-12\n", + " F1 = F_mass(xi_guess, epsilon, c_mass_init)\n", + " F0 = F_mass(xi_guess_prev, epsilon, c_mass_init)\n", + " while xi_secant_iter < xi_secant_max_iter and abs(F1) > secant_tol:\n", + " xi_secant_iter += 1\n", + " denom = F1 - F0\n", + " if abs(denom) < 1e-30 or xi_guess == xi_guess_prev:\n", + " break\n", + " xi_guess_next = xi_guess - F1 * (xi_guess - xi_guess_prev) / denom\n", + " xi_guess_prev = float(xi_guess)\n", + " xi_guess = float(xi_guess_next)\n", + " F1 = F_mass(xi_guess, epsilon, c_mass_init)\n", + " F0 = F_mass(xi_guess_prev, epsilon, c_mass_init)\n", + " print(f\"Secant approach converged in {xi_secant_iter} iterations\")\n", + " # now assign corrected values\n", + " Xnew = _set_clipped_sum_c_tmp_scalar(model_cur.sc[\"X\"], xi_guess, model_cur.dt, epsilon)\n", + " assign_from_sub(Xnew, Xfunc, Xdof)\n", + " Bnew = _set_clipped_sum_c_tmp_scalar(model_cur.sc[\"B\"], xi_guess, model_cur.dt, epsilon)\n", + " assign_from_sub(Bnew, Bfunc, Bdof)\n", + "\n", + "\n", " for species_name, species in model_cur.sc.items:\n", " results[species_name].write(model_cur.sc[species_name].u[\"u\"], model_cur.t)\n", " # End if we've passed the final time\n", diff --git a/examples/example1/spheroid_ellipsoid_mesh.h5 b/examples/example1/spheroid_ellipsoid_mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..41202e489a8b347871add916974f6c047c311b9c GIT binary patch literal 2304688 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ℜ$SPf|A)%l6-zNu2ZY`lL=nps@Qbl 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%0Ad{wrJ`RRpK& zqww6&@cWw{`7bbzU5C5QEk*y_1E0Uso1gx;0pAPwdjXXZhdxt^1oiU)%WGI{M!{%K*lc-xJ?U)4@3s``w?t7@Y3YwtgwBTRH>& zQH=L7;H!t+e`t+M_@} zKa>M!N$|Z2Jv=Ah`U?GTye5plbwz*F{ss5nxV~=&KJ%s4r)|QXyx`i2{p0cPT5u=f zdLi0n=+A+DZ@}+5;2!qv#eX%>KM#4=;kW+w6Yfi-9_Ys__qXOl?qlRyf0k6g zL+=fJJvf~|h3hBRS5>(`%0DT=6`pTp9%32KkNMAB*k%6H_}m4azfss-}(^0wZr~1{GSuKJ7}%% ze+{~M`QF%>1ph8W{z3e354z*mehSC$HTb`PuN8Q1!|(U?cl;cFXPw_z#~aRbsvzI@ zXILj={^eElrovA3*Wvj%%lM4Vb2tJ2xGyd0{q6k9{h_n5vn%!uqW^r}tgkeG6BE6j zhZx51H)3CS&e6Bv{000ik>fgMHTbQsG`^P{T*et*2H#WKE704(pN)Rcj9mrM`!)Cd zfL}cac{TL2(5*iW>zW<^=676gn%6MD6Bk_H({JVnP9op+k@=}`pSJnc%J7Hrod)>N z^REu#N9+6VF)p1)R6(!vh&L=I|M0K*QTNAmV*FY^64n>hV|*23 ze4PeI2jtIYeEovoZqu3vtqwlt4XwcM{NVxo6TxTPs21{#AKXQM7(Xz+=02Wq|Bm~2 zjn8=gOI76WLw|g5hxyZb`2Pxiu>QLac%2`X1mA!2L+m^be-`Mg(Bu23GyZ9Uyx*Y@ z1m9Tb;rgN`^sqk2`o;Osqw>?v|MMe%DEh~Mdjb66{3ILx66a{1k91t0gB;`VQTa39 zFRs5^!WRp@<7^q9J(1s=)_IQgFb&~1F6sEUK6*Fw*4XzsZPdEV_sBo!i;6F$#D3?G z#$k$s|0?)h#~a_X4%hn2<&3X#=ySgA@1K@}9{vt$1>{>_`#$5$`r487?_T>ETle%qcZF{(Z4dBA(HG!f&#wsc7>=(C$g%$3@#XoS39#n`_NPUE zeB_7km)zXv@9(4&xi{Pgw|mxKE`q{Ox$}pT-W? zG42n%ihTFkxWDFG`13>WLH}C+G6VaQLbu+_I9eZYErNboIp8RQ{4w0;In}NY!r#XU z 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%0AYT@F>&tb)^4O2_8)>+{8Tq97 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 z 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

%%h@5?26y! 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�_dydFK+WLO8~okiUjaT4cunN{7P#L> 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

p%P7{ty1{ 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%0Ds23zC*RVihk4e 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 z�fdak5<9|2jIC(SGK}^5)ffyiuLey48= zKGL`T+2;Bi>oZxd&RCzx=GGgnGdIeOa-+P_<3^908|B9G<|CbavQb~7b>>F7vAnsu zDUJFVtv5H8n;ZXM`*yG+NwVWm^#A{Q7K5`PppjX)M^;WYR~MuxnFp&1uQ%^BCx1$J zG57eGbJ`sFx3rJ;Y21ACWbWsD)AmuG#`I~-9Dkxb%F)PAPV>pn{nYl*{8roB=q}3B znEs^sZ_{_6`!w<=PPxh7?&Kbgxqs?Ux#?c!X|zWpA1B}ZmhPc_8u`e_^l8i-|1G+Y zd6$posW;zzqq`_S>GY>Of1*1mN8_oVIeMb|D3|)ypZ49EXb(-F`N&5;PQE$H;pXR@ zew)4r-KX)?mz(Gw%F)Qj^i#`Cl*i2R(VWKg>2J}y=p7nQeL2j1{-<;g-Jy|>eB?i+ zd*~jGr@q`Ry@R>W$DB`E9;e)??+)6dG5twzzIoC+Xij7Lr&`2m-$ z|J&&MFu#wF=BYQ|9PJ|?`N&5;rcZxLcQNnq@zZ(kooer5?(xx_M*g?x9rVtmCx6=G zZ*&(k&&Qn8Pv?0j@6jlq%z5g}({jj1KBj-F!h#6El}O z_ssEhE|0l4>D&BvXS&D7yu-(w)7xC`DZPVvZ}W4$>Ab&b_fVe3Q(tbPdnh;Q^ySeU z`5Wai^Pl?DUfxe_56x*zpT^8>zB$^*&A*+?Z}dLO)5yoopXTC<~YsMf2zHQ?$MY&jdI98r9HGa=~LgGr}Q4?JwBRmT5h6!luP}# z@7^hW589(KeHt^zpD2%+XA!Mu|`jq<7aw{!>X-|F0(_S4V3N%L>%J+x0_`l&N#eoFf|?dAMd zPj^p!?_uuoahjj{nR}{z7rJ+=?M-wKwbQjHOrMsAWo1gR4d5@OE^e3Hu?we1PM>!h#cOGM?UhAkGHQ+f}lJ#&;x&Hom?hxra4b52k5$+ve(chDY<{NyyB{M=7%4?msf z-c#*+Fz@m4cAoi9wf8aa@X>tI>C68Vy^r3dar4c;Mc;wmp^-mv%1!=uXWHXq-nsR2 z|5SSi?a`S2r1@{tcVON>^-ptoKeapf={)yNwRh1Tjp@@9b8pI}Zx79BJoV*n=^eCB zWBQZkqkZHfANiPmYPnO|$K2y%&gs*6=4jmRWlsJrx{vPCnEs^sXdl!6ROepa&pDl( z_A-~+9-7n0Pv$&z<~MC0Hs5@rcTg_%r+)5jcelBFZ_#_`E{*BaNqIDPV@9rPy3mh zw0+DRAI&E{`SzaDeRPjTK2HAaJnzux9&Y~aTpqo1N_#l%P4mfj#~k^{$IUnYl-|L- zGx>7cTyCQ~C{H6F`N&V2qdATIWX@^K{G{bkjz)fRn`b_?eKe<$kLjnDn<$TRw|d&+ zC*8-K)7xBbqJ7NVb-0tK&_so-1Zt`>g zR_9$Br+eGn-jqu}wSC;?avR-2c^cEFlbO#sEr*+Lj=9Ibr8{Up_2y6W>5hC-9zUJu z-nX>x#Oa-!(|Ec!-sVqp``@Pb(R(zePh;lzx18>zPvh-7na?|^<_JWliUQ`=9*@s-cvo@o&2}ndwSnK`mWTI zKjq|64%4TTnZKQ9K6TztEkF6@6Q{k&pYGiH+x=~R`(EbXzW-DAK7D7}oBZr+()KZP zw|?$_s=bTu(3n1*%)I&Jo8R*7dr#lL{T_Mre(KFPf6D3IygTLI^7Fk<_4GaNZF9Ng zwr7sH|5Uq+d5@1d|F-rnPVYUPPj@$edUx`-dpUOp&1vN0O`}A$z z-Yrkx*>X8gefwSVZ{2Y(nfGbT{HCY9TmS8MPVeP+rgmrY&7X3*&&Pac@=tT8`+0BD z)4j=`?!4ts@AC1j_ddPz^gEvJfBN13YA=6p>eKI<_HO;t_il6f9jR~cP5J5W>sw=HK4Wd#UsLQp->N>3qxO{nYkx znos_=XMW0`dT08c>HW!fXPe92(p|jW|Ec`+ed(wEsqdTKdHZ|bzBhe0|LJ?VpV~Vc zKi%8z<~-j?o%u=I!zp*_yMwtm`I+1FTX(j1p3bN5oc!s%DW867_a@)`Eq?o*Z{N=z ze)_$9KlQi1XS=)2^E)T~)}85o`qO*2e%^gc`wrahPPxh7?!7h7_fvak^369s-QVti zI-kC4@;`m&bnmTqpWb=8|Md6%)cdF3d7In5f1BUFC;zRx?oWK{-M8*c-}!C-Ti>5| zH$DB%+?#Sg?f=&A`sp6N{od1_pYCtJFYl+`_H+JpKkw0bH?`cv+x&Fr)_?l$)BW4; z{dPWoPwLzEpYBiZJ-z#{_ov_WmVf*EZu7U_`R)6+-}Be<-|F|%yY_JEdz(*t_5be% z+Ux(_&wpi_e-BcB+QW2b@;`m&uk5|u%iH(f>iJ)N*Xg@&=ich=(>tfX$Nk&9J$$i+{a*h4{MYa2_xv^e?S8*~|F8Xd^!K!ZHqZwCS_41zzXNZ-^Y*>J z_UGE)^WSWs|1SQUfA0O&ZJ-Ubfi}Up!Jk3q}_1i!j zXajAa4YYwa&<5H-8)yS Date: Tue, 23 Jun 2026 17:04:16 -0700 Subject: [PATCH 24/25] Change example1_CH for consistency with nondimensional parameters, apply weighting to variational form for mu in model.py --- examples/example1/example1_CH.ipynb | 37 +++++++++++++++++++---------- smart/model.py | 8 +++---- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/examples/example1/example1_CH.ipynb b/examples/example1/example1_CH.ipynb index 96e1af3..08f60a2 100644 --- a/examples/example1/example1_CH.ipynb +++ b/examples/example1/example1_CH.ipynb @@ -221,8 +221,13 @@ "metadata": {}, "outputs": [], "source": [ - "X = Species(\"X\", 10, surf_unit, 0.1, D_unit, \"surf\", CH=True, umax=100, A_hat = 0) \n", - "B = Species(\"B\", 90, surf_unit, 0.1, D_unit, \"surf\", CH=True, umax=100, A_hat = 25)" + "l0 = np.sqrt(4*np.pi) # reference length scale\n", + "Shat = 10.0\n", + "phi0_X = 0.1\n", + "phi0_B = 0.1\n", + "sigma_s = Shat/l0**2\n", + "X = Species(\"X\", phi0_X*sigma_s, surf_unit, 1.0, D_unit, \"surf\", CH=True, umax=sigma_s, A_hat = 0) \n", + "B = Species(\"B\", phi0_B*sigma_s, surf_unit, 1.0, D_unit, \"surf\", CH=True, umax=sigma_s, A_hat = 50)" ] }, { @@ -309,13 +314,15 @@ "metadata": {}, "outputs": [], "source": [ - "kon = Parameter(\"kon\", 0.0, 1/sec)\n", - "koff = Parameter(\"koff\", 0.0, 1/sec)\n", - "# Production of A\n", + "kon_hat = 1.0\n", + "koff_hat = 1.0\n", + "tref = l0**2 / float(X.D)\n", + "kon = Parameter(\"kon\", kon_hat*sigma_s**(3/2)/tref, 1/sec)\n", + "koff = Parameter(\"koff\", koff_hat*sigma_s**(3/2)/tref, 1/sec)\n", + "# Conversion of X to B\n", "r1 = Reaction(\"r1\", [\"X\"], [\"B\"],\n", " param_map={\"kon\": \"kon\", \"koff\": \"koff\"},\n", - " eqn_f_str=\"X*kon - B*koff\",\n", - " species_map={\"X\": \"X\", \"B\": \"B\"})" + " eqn_f_str=\"X*kon - B*koff\")" ] }, { @@ -372,9 +379,14 @@ "source": [ "useSpheroid = True\n", "if useSpheroid:\n", + " # rOuter = [0.6849, 0.4365, 2.1896]\n", + " # rInner = [0.0,0.0,0.0]\n", + " # domain, facet_markers, cell_markers = mesh_tools.create_ellipsoids(rOuter, rInner, hEdge=0.05)\n", " vol = Compartment(\"vol\", 3, um, 1) # SMART just needs to know its a 3d mesh\n", " cc.add(vol)\n", " mesh_file = pathlib.Path(\"spheroid_ellipsoid_mesh.h5\")\n", + " # mesh_file = pathlib.Path(\"spheroid_ellipsoid_mesh_new.h5\")\n", + " # mesh_tools.write_mesh(domain, facet_markers, cell_markers, filename=mesh_file)\n", "else:\n", " # define dimensions of domain\n", " Shat = 200\n", @@ -441,8 +453,8 @@ "config_cur.flags.update({\"allow_unused_components\": True})\n", "config_cur.solver.update(\n", " {\n", - " \"final_t\": 1.0,\n", - " \"initial_dt\": 1e-3,\n", + " \"final_t\": 100.0,\n", + " \"initial_dt\": 0.001,\n", " \"time_precision\": 8,\n", " \"attempt_timestep_restart_on_divergence\": True,\n", " }\n", @@ -492,7 +504,7 @@ "outputs": [], "source": [ "# add white noise perturbation to initial conditions\n", - "for sp_str in (\"X\", \"B\"):\n", + "for sp_str in (\"B\"):#(\"X\", \"B\"):\n", " sp = model_cur.sc[sp_str]\n", " u = model_cur.cc[sp.compartment_name].u[\"u\"]\n", " indices = sp.dof_map\n", @@ -596,7 +608,7 @@ "# Set loglevel to warning in order not to pollute notebook output\n", "logger.setLevel(logging.WARNING)\n", "\n", - "epsilon = 0.01\n", + "epsilon = 0.001\n", "xi_secant_max_iter = 500\n", "\n", "# Solve\n", @@ -612,7 +624,8 @@ " secant_tol = 1e-12\n", " F1 = F_mass(xi_guess, epsilon, c_mass_init)\n", " F0 = F_mass(xi_guess_prev, epsilon, c_mass_init)\n", - " while xi_secant_iter < xi_secant_max_iter and abs(F1) > secant_tol:\n", + " while (xi_secant_iter < xi_secant_max_iter and \n", + " abs(F1) > secant_tol and abs(F0) > secant_tol):\n", " xi_secant_iter += 1\n", " denom = F1 - F0\n", " if abs(denom) < 1e-30 or xi_guess == xi_guess_prev:\n", diff --git a/smart/model.py b/smart/model.py index 0360051..2a25a1b 100644 --- a/smart/model.py +++ b/smart/model.py @@ -1397,13 +1397,12 @@ def _init_5_2_create_variational_forms(self): A_hat = species.A_hat phi_cur = u / species.umax df_c = d.ln(phi_cur) - d.ln(1 - phi_cur) - A_hat * (2 * phi_cur - 1) + # CForm scaling factor + CScale = (float(species.D) * species.umax) / (4 * np.pi) # assuming l^2 = 4*pi CForm = J * ( (u_c - df_c) * v_c * dx - (A_hat / species.umax) * d.inner(d.grad(phi_cur), d.grad(v_c)) * dx ) - CForm_units = ( - species.compartment.compartment_units**species.compartment.dimensionality - ) # chemical potential is in units of kBT for convenience Dform = J * D * u * d.inner(d.grad(u_c), d.grad(v)) * dx self.forms.add( @@ -1412,9 +1411,10 @@ def _init_5_2_create_variational_forms(self): CForm, species.chem_potential, "chem_potential", - CForm_units, + Dform_units, True, linear_wrt_comp, + form_scaling=CScale, ) ) self.forms.add( From bcb9a18bcb1ed4834352fe885291651e8a0eb892 Mon Sep 17 00:00:00 2001 From: Ji Yeon Hyun Date: Sun, 23 Aug 2026 16:44:58 -0700 Subject: [PATCH 25/25] Add full structure-preserving script for example1 --- .../example1/example1_full_preservation.py | 598 ++++++++++++++++++ 1 file changed, 598 insertions(+) create mode 100644 examples/example1/example1_full_preservation.py diff --git a/examples/example1/example1_full_preservation.py b/examples/example1/example1_full_preservation.py new file mode 100644 index 0000000..f613b75 --- /dev/null +++ b/examples/example1/example1_full_preservation.py @@ -0,0 +1,598 @@ +import dolfin as d +import os +import sympy as sym +import numpy as np +import pathlib +import gmsh # must be imported before pyvista if dolfin is imported first +import sys + +# Use the CH-enabled SMART tree (same as example1_CH copy.ipynb). Without this, +# system Python loads /usr/lib/python3/dist-packages/smart, which has no CH=. +sys.path.insert(0, "/home/shared/smartdir/smart-smart-withCH") + +from smart import config, common, mesh, model, mesh_tools, visualization +from smart.units import unit +from smart.model_assembly import ( + Compartment, + Parameter, + Reaction, + Species, + SpeciesContainer, + ParameterContainer, + CompartmentContainer, + ReactionContainer, +) +import logging +import atexit +from datetime import datetime + +logger = logging.getLogger("smart") +logger.setLevel(logging.INFO) + +# Aliases - base units +um = unit.um +molecule = unit.molecule +sec = unit.sec +dimensionless = unit.dimensionless +D_unit = um**2 / sec +flux_unit = molecule / (um * sec) +surf_unit = molecule / um**2 +vol_unit = molecule / um**3 +edge_unit = molecule / um + +surf = Compartment("surf", 2, um, 10) + +cc = CompartmentContainer() +cc.add([surf]) + +l0 = 1.0#np.sqrt(4*np.pi) # reference length scale +Shat = 30.0 +phi0_X = 0.1 +phi0_B = 0.1 +sigma_s = Shat/l0**2 +Lmax = (Shat**(3/2))/l0**3 +Linit = 0.01*Lmax +print(Linit) +X = Species("X", phi0_X*sigma_s, surf_unit, 0.01, D_unit, "surf", CH=True, umax=sigma_s, A_hat = 0) +B = Species("B", phi0_B*sigma_s, surf_unit, 0.01, D_unit, "surf", CH=True, umax=sigma_s, A_hat = 20.0) +L = Species("L", Linit, vol_unit, 1.0, D_unit, "vol", umax=Lmax) + +sc = SpeciesContainer() +sc.add([L,X,B]) + +Kd = 7.5e-6 * (Shat**(3/2))/l0**3 +koff_hat = 1.0 # 0.0 #0.6 +kon_hat = koff_hat / Kd #0.9 +tref = l0**2 / float(L.D) +kon = Parameter("kon", kon_hat/tref, 1/(vol_unit*sec)) +# kon = Parameter("kon", 0.1*kon_hat*10/tref, surf_unit/sec) +koff = Parameter("koff", koff_hat/tref, 1/sec) +# Conversion of X to B +r1 = Reaction("r1", ["X","L"], ["B"], + param_map={"kon": "kon", "koff": "koff"}, + eqn_f_str="kon*X*L - B*koff") + +pc = ParameterContainer() +pc.add([kon, koff]) +rc = ReactionContainer() +rc.add([r1]) + +useSpheroid = True +if useSpheroid: + rOuter = [0.6849, 0.4365, 2.1896] + rInner = [0.0,0.0,0.0] + hEdge = 0.1 + domain, facet_markers, cell_markers = mesh_tools.create_ellipsoids(rOuter, rInner, hEdge=hEdge) + # domain, facet_markers, cell_markers = mesh_tools.create_cubes(N=21) + # for f in d.facets(domain): + # if f.midpoint().z() < 0.999: + # facet_markers[f] = 0 + vol = Compartment("vol", 3, um, 1) # SMART just needs to know its a 3d mesh + cc.add(vol) + # mesh_file = pathlib.Path("spheroid_ellipsoid_mesh.h5") + mesh_file = pathlib.Path("spheroid_ellipsoid_mesh_new.h5") + mesh_tools.write_mesh(domain, facet_markers, cell_markers, filename=mesh_file) +else: + # define dimensions of domain + Shat = 200 + x_size = np.sqrt(Shat/B.umax) + y_size = np.sqrt(Shat/B.umax) + # Create mesh + m = 40 + n = int(x_size/y_size)*m + rect_mesh = d.RectangleMesh(d.Point(0.0, 0.0), d.Point(x_size, y_size), n, m) + mf2 = d.MeshFunction("size_t", rect_mesh, 2, 10) + mf1 = d.MeshFunction("size_t", rect_mesh, 1, 0) + class OuterEdge(d.SubDomain): + def inside(self, x, on_boundary): + return on_boundary + outerEdge = OuterEdge() + outerEdge.mark(mf1, 3) + mesh_folder = pathlib.Path("rect_mesh") + mesh_folder.mkdir(exist_ok=True) + mesh_file = mesh_folder / "rect_mesh.h5" + mesh_tools.write_mesh(rect_mesh, mf1, mf2, mesh_file) + +parent_mesh = mesh.ParentMesh( + mesh_filename=str(mesh_file), + mesh_filetype="hdf5", + name="parent_mesh", +) +config_cur = config.Config() +config_cur.flags.update({"allow_unused_components": True}) +config_cur.solver.update( + { + "final_t": 1000.0, + "initial_dt": 0.001, + "time_precision": 8, + "attempt_timestep_restart_on_divergence": True, + } +) + +# Result folder + run log (tee stdout/stderr so print() and SMART logs are saved). +# Installed before initialize() so JIT/solver setup is captured too. +SCRIPT_DIR = pathlib.Path(os.path.dirname(os.path.abspath(__file__))) +# SCRATCH_DIRECTORY was for server runs (e.g. SLURM scratch). Uncomment to use it instead of SCRIPT_DIR. +# SCRATCH_DIRECTORY = pathlib.Path(os.environ.get("SCRATCH_DIRECTORY", "/root/scratch")) + + +def _default_result_folder(): + name = ( + f"S{Shat}_AX{X.A_hat}_Ab{B.A_hat}_" + f"phi0X{phi0_X}_phi0B{phi0_B}_phi0L{Linit}_" + f"D_X{X.D}_D_B{B.D}_D_L{L.D}_" + f"kon{kon_hat}_koff{koff_hat}_l0{l0}" + ) + if useSpheroid: + name = ( + f"a{rOuter[0]}_b{rOuter[1]}_c{rOuter[2]}_hEdge{hEdge}_" + name + ) + return SCRIPT_DIR / name / "results_reactRedo" + + +class _Tee: + """Write to the terminal and a log file at the same time.""" + + def __init__(self, *streams): + self.streams = streams + self.encoding = getattr(streams[0], "encoding", "utf-8") + self.errors = getattr(streams[0], "errors", "strict") + self.name = getattr(streams[-1], "name", "") + + def write(self, data): + for stream in self.streams: + stream.write(data) + stream.flush() + return len(data) + + def flush(self): + for stream in self.streams: + stream.flush() + + def isatty(self): + return False + + def fileno(self): + return self.streams[0].fileno() + + +_result_base = os.environ.get("RESULT_BASE_DIR", "").strip() +result_folder = pathlib.Path(_result_base) if _result_base else _default_result_folder() +result_folder.mkdir(parents=True, exist_ok=True) +_log_path = result_folder / "run.log" +_log_file = open(_log_path, "a", encoding="utf-8") +atexit.register(_log_file.close) +sys.stdout = _Tee(sys.stdout, _log_file) +sys.stderr = _Tee(sys.stderr, _log_file) +print(f"[log] writing stdout/stderr to {_log_path}", flush=True) +print( + f"[log] start {datetime.now().isoformat(timespec='seconds')} " + f"cwd={os.getcwd()} Linit={Linit} Shat={Shat} A_hat_B={B.A_hat}", + flush=True, +) + +model_cur = model.Model(pc, sc, cc, rc, config_cur, parent_mesh) +model_cur.initialize() +model_cur.to_pickle(str(result_folder / "model_cur.pkl")) + + +import petsc4py.PETSc as PETSc +# most of these were originally set in smart.model and altered here to tailor this problem +if config_cur.solver['use_snes']: + model_cur.solver.setType('newtonls') + opts = PETSc.Options() + opts['snes_linesearch_type'] = 'basic' + model_cur.solver.setFromOptions() + # set number of failed solves (tailored to this problem) + model_cur.solver.setMaxKSPFailures(200) + model_cur.solver.setMaxLinearSolveFailures(200) + # relax solver tolerances (tailored to this problem) + rtol_scale = 1.5 + atol_scale = 1 + model_cur.solver.setTolerances(1e-6*rtol_scale, 1e-6*atol_scale, 1e-20, 50) + ksp_rtol_scale = 1.5 + ksp_atol_scale = 1 + ksp_maxits = 1e5 # default 1e4 + model_cur.solver.ksp.setTolerances(1e-4*ksp_rtol_scale, 1e-6*ksp_atol_scale, 1e6, ksp_maxits) + + + +# Two-constraint mass corrector (same logic as TSCC/260816/S10_A20.py). +# SMART stores surface densities u = phi * umax; simplex is applied in phi-space. +# Ligand budget is dimensional: int L dv + int B ds (no S^{-1/2} prefactor). +epsilon = 1e-5 +xi_secant_max_iter = 500 +secant_tol = 1e-10 + +Xfunc = model_cur.sc["X"].u["u"] +Xdof = model_cur.sc["X"].dof_map +Bfunc = model_cur.sc["B"].u["u"] +Bdof = model_cur.sc["B"].dof_map +Lfunc = model_cur.sc["L"].u["u"] +Ldof = model_cur.sc["L"].dof_map +dx_pm = d.Measure("dx", model_cur.cc["surf"].dolfin_mesh) +dx_vol = d.Measure("dx", model_cur.cc["vol"].dolfin_mesh) +umax_X = float(model_cur.sc["X"].umax) +umax_B = float(model_cur.sc["B"].umax) + +X_ic = d.Function(model_cur.sc["X"].V) +B_ic = d.Function(model_cur.sc["B"].V) +L_ic = d.Function(model_cur.sc["L"].V) +d.assign(X_ic, model_cur.sc["X"].sol) +d.assign(B_ic, model_cur.sc["B"].sol) +d.assign(L_ic, model_cur.sc["L"].sol) + +c_mass_tmp_X = d.Function(model_cur.sc["X"].V) +c_mass_tmp_B = d.Function(model_cur.sc["B"].V) +c_mass_tmp_L = d.Function(model_cur.sc["L"].V) +c_x_proj = d.Function(model_cur.sc["X"].V) +c_b_proj = d.Function(model_cur.sc["B"].V) +c_L_proj = d.Function(model_cur.sc["L"].V) + + +def _as_scalar_xi(val): + return float(np.asarray(val).reshape(-1)[0]) + + +def assign_from_sub(subfunc, func, dofmap): + fullvec = func.vector()[:] + subvec = subfunc.vector()[:] + fullvec[dofmap] = subvec + func.vector().set_local(fullvec) + func.vector().apply("insert") + + +def _project_simplex_XB(x_vals, b_vals, eps): + """Nodewise Euclidean projection of (phi_X, phi_B) onto + S_eps = {phi_B >= eps, phi_X >= eps, phi_B + phi_X <= 1 - eps}. + """ + x = np.array(x_vals, dtype=float, copy=True) + b = np.array(b_vals, dtype=float, copy=True) + cap = 1.0 - float(eps) + over = (b + x) > cap + if np.any(over): + t = 0.5 * ((b[over] + x[over]) - cap) + b[over] = b[over] - t + x[over] = x[over] - t + lo_b = b < eps + if np.any(lo_b): + b[lo_b] = eps + x[lo_b] = np.clip(x[lo_b], eps, cap - eps) + lo_x = x < eps + if np.any(lo_x): + x[lo_x] = eps + b[lo_x] = np.clip(b[lo_x], eps, cap - eps) + return x, b + + +def _set_projected_XB(c_tmp_X, c_tmp_B, x_src, b_src, xi1_scalar, xi2_scalar, dt_val, eps): + """X <- X_tilde + dt*xi_1, + B <- B_tilde + dt*(xi_1 + xi_2), + then jointly project fractions onto S_eps. + """ + d.assign(c_tmp_X, x_src) + d.assign(c_tmp_B, b_src) + xv = np.asarray(c_tmp_X.vector()[:], dtype=float) + bv = np.asarray(c_tmp_B.vector()[:], dtype=float) + xi1 = _as_scalar_xi(xi1_scalar) + xi2 = _as_scalar_xi(xi2_scalar) + xv = xv + float(dt_val) * xi1 + bv = bv + float(dt_val) * (xi1 + xi2) + phi_x, phi_b = _project_simplex_XB(xv / umax_X, bv / umax_B, float(eps)) + c_tmp_X.vector().set_local(phi_x * umax_X) + c_tmp_X.vector().apply("insert") + c_tmp_B.vector().set_local(phi_b * umax_B) + c_tmp_B.vector().apply("insert") + + +def _set_clipped_sum_c_tmp_vol_scalar(c_tmp, c_src, xi2_scalar, dt_val): + """Bulk L <- clip(L_tilde + dt*xi_2) into [eps*umax, (1-eps)*umax].""" + umax_L = float(model_cur.sc["L"].umax) + lo = umax_L * float(epsilon) + hi = umax_L * (1.0 - float(epsilon)) + d.assign(c_tmp, c_src) + c_vals = np.asarray(c_tmp.vector()[:], dtype=float) + y = np.clip(c_vals + float(dt_val) * _as_scalar_xi(xi2_scalar), float(lo), float(hi)) + c_tmp.vector().set_local(y) + c_tmp.vector().apply("insert") + + +def F_mass(xi_arg1, xi_arg2, dt_val): + """F(xi_1,xi_2) = int(P_X + P_B) - int(X_ic + B_ic).""" + _set_projected_XB( + c_mass_tmp_X, c_mass_tmp_B, + model_cur.sc["X"].sol, model_cur.sc["B"].sol, + xi_arg1, xi_arg2, dt_val, float(epsilon), + ) + form = (c_mass_tmp_X + c_mass_tmp_B - X_ic - B_ic) * dx_pm + return float(d.assemble_mixed(form)) + + +def G_mass(xi_arg1, xi_arg2, dt_val): + """G(xi_1,xi_2) = int(P_B - B_ic) ds + int(P_L - L_ic) dv.""" + _set_projected_XB( + c_mass_tmp_X, c_mass_tmp_B, + model_cur.sc["X"].sol, model_cur.sc["B"].sol, + xi_arg1, xi_arg2, dt_val, float(epsilon), + ) + _set_clipped_sum_c_tmp_vol_scalar( + c_mass_tmp_L, model_cur.sc["L"].sol, xi_arg2, dt_val + ) + form_B = (c_mass_tmp_B - B_ic) * dx_pm + form_L = (c_mass_tmp_L - L_ic) * dx_vol + return float(d.assemble_mixed(form_B)) + float(d.assemble_mixed(form_L)) + + +def J_abcd(xi1_prev, xi2_prev, xi1_curr, xi2_curr, dt_val): + x1p, x2p = _as_scalar_xi(xi1_prev), _as_scalar_xi(xi2_prev) + x1c, x2c = _as_scalar_xi(xi1_curr), _as_scalar_xi(xi2_curr) + a_k = (F_mass(x1c, x2c, dt_val) - F_mass(x1p, x2c, dt_val)) / (x1c - x1p) + b_k = (F_mass(x1c, x2c, dt_val) - F_mass(x1c, x2p, dt_val)) / (x2c - x2p) + c_k = (G_mass(x1c, x2c, dt_val) - G_mass(x1p, x2c, dt_val)) / (x1c - x1p) + d_k = (G_mass(x1c, x2c, dt_val) - G_mass(x1c, x2p, dt_val)) / (x2c - x2p) + return a_k, b_k, c_k, d_k + + +def _vertex_min_max_mean(f): + vals = np.asarray(f.compute_vertex_values(), dtype=float) + return float(np.min(vals)), float(np.max(vals)), float(np.mean(vals)) + + +def _integrals_XB_L(): + int_X = float(d.assemble_mixed(model_cur.sc["X"].sol * dx_pm)) + int_B = float(d.assemble_mixed(model_cur.sc["B"].sol * dx_pm)) + int_L = float(d.assemble_mixed(model_cur.sc["L"].sol * dx_vol)) + return int_X, int_B, int_L + + +def _surface_sum_phi_stats(): + """Min / max / mean of (phi_X + phi_B) at P1 vertices (fraction space).""" + xv = np.asarray(model_cur.sc["X"].sol.compute_vertex_values(), dtype=float) / umax_X + bv = np.asarray(model_cur.sc["B"].sol.compute_vertex_values(), dtype=float) / umax_B + s = xv + bv + return float(np.min(s)), float(np.max(s)), float(np.mean(s)) + + +def dt_scale_from_max_newton(max_newton_its): + """Map max SNES Newton iteration count to dt scale (same bins as adjust_dt.py).""" + n = int(max_newton_its) + if n in (0, 1): + return 1.05 + if n in (2, 3): + return 1.01 + if n in (4, 5): + return 1.005 + if n in (6, 7, 8, 9, 10): + return 0.9 + if n in (11, 12, 13, 14, 15, 16, 17, 18, 19, 20): + return 0.8 + else: + return 0.5 + + + +# Write initial condition(s) to file +results = dict() +for species_name, species in model_cur.sc.items: + results[species_name] = d.XDMFFile( + model_cur.mpi_comm_world, str(result_folder / f"{species_name}.xdmf") + ) + results[species_name].parameters["flush_output"] = True + results[species_name].write(model_cur.sc[species_name].u["u"], model_cur.t) + +# Set loglevel to warning in order not to pollute notebook output +logger.setLevel(logging.WARNING) + +int_X0, int_B0, int_L0 = _integrals_XB_L() +int_XB0 = int_X0 + int_B0 +int_LB0 = int_L0 + int_B0 +mn_X, mx_X, av_X = _vertex_min_max_mean(model_cur.sc["X"].sol) +mn_B, mx_B, av_B = _vertex_min_max_mean(model_cur.sc["B"].sol) +mn_L, mx_L, av_L = _vertex_min_max_mean(model_cur.sc["L"].sol) +print( + f"[IC] int X={int_X0:.12g} int B={int_B0:.12g} int(X+B)={int_XB0:.12g} " + f"int L={int_L0:.12g} int L + int B={int_LB0:.12g}", + flush=True, +) +print( + f"[IC] X min/max/mean={mn_X:.6g}/{mx_X:.6g}/{av_X:.6g} " + f"B min/max/mean={mn_B:.6g}/{mx_B:.6g}/{av_B:.6g} " + f"L min/max/mean={mn_L:.6g}/{mx_L:.6g}/{av_L:.6g}", + flush=True, +) + +tvec = [float(model_cur.t)] +total_L_list = [int_L0] +total_X_list = [int_X0] +total_B_list = [int_B0] +total_XB_list = [int_XB0] +min_X_list, max_X_list, mean_X_list = [mn_X], [mx_X], [av_X] +min_B_list, max_B_list, mean_B_list = [mn_B], [mx_B], [av_B] +_, mx_xb0, av_xb0 = _surface_sum_phi_stats() +max_XB_list, mean_XB_list = [mx_xb0], [av_xb0] +mass_cons_vec = [[int_LB0, int_XB0]] +np.savetxt(str(result_folder / "mass_cons_vec.txt"), mass_cons_vec) + + +def _save_monitoring_timeseries(): + np.savez_compressed( + result_folder / "monitoring_timeseries.npz", + t=np.asarray(tvec, dtype=float), + total_L=np.asarray(total_L_list, dtype=float), + total_X=np.asarray(total_X_list, dtype=float), + total_B=np.asarray(total_B_list, dtype=float), + total_XB=np.asarray(total_XB_list, dtype=float), + max_X=np.asarray(max_X_list, dtype=float), + min_X=np.asarray(min_X_list, dtype=float), + mean_X=np.asarray(mean_X_list, dtype=float), + max_B=np.asarray(max_B_list, dtype=float), + min_B=np.asarray(min_B_list, dtype=float), + mean_B=np.asarray(mean_B_list, dtype=float), + max_XB=np.asarray(max_XB_list, dtype=float), + mean_XB=np.asarray(mean_XB_list, dtype=float), + epsilon=np.asarray([float(epsilon)], dtype=float), + S_hat=np.asarray([float(Shat)], dtype=float), + ) + + +_save_monitoring_timeseries() +print(f"[monitor] initial timeseries written t={float(model_cur.t):.8g}", flush=True) + +dt_max_base = 0.02 + +# Solve +while True: + print(f"Time is {model_cur.t}", flush=True) + model_cur.monolithic_solve() + dt_step = float(model_cur.dt) + n_newton = model_cur.idx_nl[-1] + print(f"Number of Newton its: {n_newton}", flush=True) + + int_X_pred, int_B_pred, int_L_pred = _integrals_XB_L() + print( + f"[pred-mass] int(X+B)={int_X_pred + int_B_pred:.12g} " + f"(IC {int_XB0:.12g}, diff={int_X_pred + int_B_pred - int_XB0:.6e}) | " + f"int L + int B={int_L_pred + int_B_pred:.12g} " + f"(IC {int_LB0:.12g}, diff={int_L_pred + int_B_pred - int_LB0:.6e})", + flush=True, + ) + + # Two-scalar secant on (xi_1, xi_2); initial guesses (0,0) and (-dt,-dt). + xi_secant_iter = 0 + xi_guess_prev = [0.0, 0.0] + xi_guess = [-dt_step, -dt_step] + xi_guess_next = None + a_k, b_k, c_k, d_k = J_abcd( + xi_guess_prev[0], xi_guess_prev[1], xi_guess[0], xi_guess[1], dt_step + ) + F1 = F_mass(xi_guess[0], xi_guess[1], dt_step) + G1 = G_mass(xi_guess[0], xi_guess[1], dt_step) + + while xi_guess_next is None or (abs(F1) > secant_tol or abs(G1) > secant_tol): + xi_secant_iter += 1 + if xi_secant_iter > xi_secant_max_iter: + print( + f"[secant] hit max iter={xi_secant_max_iter} F={F1:.6e} G={G1:.6e}", + flush=True, + ) + break + denom = a_k * d_k - b_k * c_k + if abs(denom) < 1e-30: + print("[secant] singular Jacobian, stopping", flush=True) + break + f1 = F_mass(xi_guess[0], xi_guess[1], dt_step) + g1 = G_mass(xi_guess[0], xi_guess[1], dt_step) + xi_guess_next = [ + xi_guess[0] - (d_k * f1 - b_k * g1) / denom, + xi_guess[1] - (a_k * g1 - c_k * f1) / denom, + ] + xi_guess_prev = [float(xi_guess[0]), float(xi_guess[1])] + xi_guess = [float(xi_guess_next[0]), float(xi_guess_next[1])] + a_k, b_k, c_k, d_k = J_abcd( + xi_guess_prev[0], xi_guess_prev[1], xi_guess[0], xi_guess[1], dt_step + ) + F1 = F_mass(xi_guess[0], xi_guess[1], dt_step) + G1 = G_mass(xi_guess[0], xi_guess[1], dt_step) + + xi1_final, xi2_final = float(xi_guess[0]), float(xi_guess[1]) + print( + f"Secant approach converged in {xi_secant_iter} iterations " + f"F={F1:.6e} G={G1:.6e} xi1={xi1_final:.6g} xi2={xi2_final:.6g}", + flush=True, + ) + + _set_projected_XB( + c_x_proj, c_b_proj, + model_cur.sc["X"].sol, model_cur.sc["B"].sol, + xi1_final, xi2_final, dt_step, float(epsilon), + ) + _set_clipped_sum_c_tmp_vol_scalar( + c_L_proj, model_cur.sc["L"].sol, xi2_final, dt_step + ) + assign_from_sub(c_x_proj, Xfunc, Xdof) + assign_from_sub(c_b_proj, Bfunc, Bdof) + assign_from_sub(c_L_proj, Lfunc, Ldof) + + if len(model_cur.problem.global_sizes) == 1: + model_cur._ubackend = model_cur.u["u"]._functions[0].vector().vec().copy() + else: + model_cur._ubackend = PETSc.Vec().createNest( + [usub.vector().vec().copy() for usub in model_cur.u["u"]._functions], + comm=model_cur.mpi_comm_world, + ) + model_cur._init_4_4_get_species_u_v_V_dofmaps() + model_cur._init_4_5_name_functions() + model_cur.update_solution() + + int_X, int_B, int_L = _integrals_XB_L() + int_XB = int_X + int_B + int_LB = int_L + int_B + mass_cons_vec.append([int_LB, int_XB]) + np.savetxt(str(result_folder / "mass_cons_vec.txt"), mass_cons_vec) + mn_X, mx_X, av_X = _vertex_min_max_mean(model_cur.sc["X"].sol) + mn_B, mx_B, av_B = _vertex_min_max_mean(model_cur.sc["B"].sol) + mn_L, mx_L, av_L = _vertex_min_max_mean(model_cur.sc["L"].sol) + print( + f"[corr-mass] int(X+B)={int_XB:.12g} (diff IC {int_XB - int_XB0:.6e}) | " + f"int L + int B={int_LB:.12g} (diff IC {int_LB - int_LB0:.6e})", + flush=True, + ) + print( + f"Min/max B={mn_B:.6g}/{mx_B:.6g} X={mn_X:.6g}/{mx_X:.6g} L={mn_L:.6g}/{mx_L:.6g}", + flush=True, + ) + + mn_xb, mx_xb, av_xb = _surface_sum_phi_stats() + print(f"[interface] max(phi_X+phi_B)={mx_xb:.6g} mean={av_xb:.6g}", flush=True) + + dtFactor = dt_scale_from_max_newton(n_newton) + dt_next = min(dt_step * dtFactor, dt_max_base) + if dt_next < 1e-5: + dt_next = 1e-5 + model_cur.set_dt(dt_next) + print(f"[dt] next dt={float(model_cur.dt):.6g} (scale={dtFactor})", flush=True) + + if np.mod(model_cur.idx, 100) == 0: + for species_name, species in model_cur.sc.items: + results[species_name].write(model_cur.sc[species_name].u["u"], model_cur.t) + tvec.append(float(model_cur.t)) + total_L_list.append(int_L) + total_X_list.append(int_X) + total_B_list.append(int_B) + total_XB_list.append(int_XB) + min_X_list.append(mn_X) + max_X_list.append(mx_X) + mean_X_list.append(av_X) + min_B_list.append(mn_B) + max_B_list.append(mx_B) + mean_B_list.append(av_B) + max_XB_list.append(mx_xb) + mean_XB_list.append(av_xb) + _save_monitoring_timeseries() + print( + f"[monitor] timeseries updated t={float(model_cur.t):.8g} step={model_cur.idx}", + flush=True, + ) + + if model_cur.t >= model_cur.final_t: + break