from helper import * # settings for the multidomain solver multidomain_solver = { "timeStepWidth": variables.dt_multidomain, # time step width of the subcellular problem "endTime": variables.end_time, # end time, this is not relevant because it will be overridden by the splitting scheme "timeStepOutputInterval": 1, # how often the output timestep should be printed "durationLogKey": "duration_multidomain", # key for duration in log.csv file "slotNames": ["vm_old", "vm_new", "g_mu", "g_tot"], # names of the data connector slots, maximum length per name is 6 characters. g_mu is gamma (active stress) of the compartment, g_tot is the total gamma # material parameters for the compartments "nCompartments": variables.n_compartments, # number of compartments "compartmentRelativeFactors": variables.relative_factors.tolist(), # list of lists of (the factors for all dofs), because "inputIsGlobal": True, this contains the global dofs "inputIsGlobal": True, # if values and dofs correspond to the global numbering "am": [variables.get_am(mu_no) for mu_no in range(variables.n_compartments)], # Am parameter for every motor unit (ration of surface to volume of fibers) "cm": [variables.get_cm(mu_no) for mu_no in range(variables.n_compartments)], # Cm parameter for every motor unit (capacitance of the cellular membrane) # solver options "solverName": "multidomainLinearSolver", # reference to the solver used for the global linear system of the multidomain eq. "theta": variables.theta, # weighting factor of implicit term in Crank-Nicolson scheme, 0.5 gives the classic, 2nd-order Crank-Nicolson scheme, 1.0 gives implicit euler "useLumpedMassMatrix": variables.use_lumped_mass_matrix, # which formulation to use, the formulation with lumped mass matrix (True) is more stable but approximative, the other formulation (False) is exact but needs more iterations "useSymmetricPreconditionerMatrix": variables.use_symmetric_preconditioner_matrix, # if the diagonal blocks of the system matrix should be used as preconditioner matrix "initialGuessNonzero": variables.initial_guess_nonzero, # if the initial guess for the 3D system should be set as the solution of the previous timestep, this only makes sense for iterative solvers "enableFatComputation": True, # disabling the computation of the fat layer is only for debugging and speeds up computation. If set to False, the respective matrix is set to the identity "showLinearSolverOutput": variables.show_linear_solver_output, # if convergence information of the linear solver in every timestep should be printed, this is a lot of output for fast computations "updateSystemMatrixEveryTimestep": False, # if this multidomain solver will update the system matrix in every first timestep, us this only if the geometry changed, e.g. by contraction "recreateLinearSolverInterval": 0, # how often the Petsc KSP object (linear solver) should be deleted and recreated. This is to remedy memory leaks in Petsc's implementation of some solvers. 0 means disabled. "rescaleRelativeFactors": True, # if all relative factors should be rescaled such that max Σf_r = 1 "setDirichletBoundaryConditionPhiE":False, # (set to False) if the last dof of the extracellular space (variable phi_e) should have a 0 Dirichlet boundary condition. However, this makes the solver converge slower. "setDirichletBoundaryConditionPhiB":False, # (set to False) if the last dof of the fat layer (variable phi_b) should have a 0 Dirichlet boundary condition. However, this makes the solver converge slower. "resetToAverageZeroPhiE": True, # if a constant should be added to the phi_e part of the solution vector after every solve, such that the average is zero
def get_diffusion_prefactor(fiber_no, mu_no): diffusion_prefactor = variables.get_conductivity(fiber_no, mu_no) / (variables.get_am(fiber_no, mu_no) * variables.get_cm(fiber_no, mu_no)) #print("diffusion_prefactor: {}/({}*{}) = {}".format(variables.get_conductivity(fiber_no, mu_no), variables.get_am(fiber_no, mu_no), variables.get_cm(fiber_no, mu_no), diffusion_prefactor)) return diffusion_prefactor
def get_diffusion_prefactor(fiber_no, mu_no): return variables.get_conductivity(fiber_no, mu_no) / ( variables.get_am(fiber_no, mu_no) * variables.get_cm(fiber_no, mu_no))
"vm_old", "vm_new", "g_mu", "g_tot" ], # names of the data connector slots, maximum length per name is 6 characters. g_mu is gamma (active stress) of the compartment, g_tot is the total gamma # material parameters for the compartments "nCompartments": variables.n_compartments, # number of compartments "compartmentRelativeFactors": variables.relative_factors.tolist( ), # list of lists of (the factors for all dofs), because "inputIsGlobal": True, this contains the global dofs "inputIsGlobal": True, # if values and dofs correspond to the global numbering "am": [ variables.get_am(mu_no) for mu_no in range(variables.n_compartments) ], # Am parameter for every motor unit (ration of surface to volume of fibers) "cm": [ variables.get_cm(mu_no) for mu_no in range(variables.n_compartments) ], # Cm parameter for every motor unit (capacitance of the cellular membrane) # solver options "solverName": "multidomainLinearSolver", # reference to the solver used for the global linear system of the multidomain eq. "theta": variables. theta, # weighting factor of implicit term in Crank-Nicolson scheme, 0.5 gives the classic, 2nd-order Crank-Nicolson scheme, 1.0 gives implicit euler "useLumpedMassMatrix": variables. use_lumped_mass_matrix, # which formulation to use, the formulation with lumped mass matrix (True) is more stable but approximative, the other formulation (False) is exact but needs more iterations "useSymmetricPreconditionerMatrix": variables. use_symmetric_preconditioner_matrix, # if the diagonal blocks of the system matrix should be used as preconditioner matrix "initialGuessNonzero":