Chaste  Release::2018.1
HeartConfigDefaults.hpp
Go to the documentation of this file.
1 /*
2 
3 Copyright (c) 2005-2018, University of Oxford.
4 All rights reserved.
5 
6 University of Oxford means the Chancellor, Masters and Scholars of the
7 University of Oxford, having an administrative office at Wellington
8 Square, Oxford OX1 2JD, UK.
9 
10 This file is part of Chaste.
11 
12 Redistribution and use in source and binary forms, with or without
13 modification, are permitted provided that the following conditions are met:
14  * Redistributions of source code must retain the above copyright notice,
15  this list of conditions and the following disclaimer.
16  * Redistributions in binary form must reproduce the above copyright notice,
17  this list of conditions and the following disclaimer in the documentation
18  and/or other materials provided with the distribution.
19  * Neither the name of the University of Oxford nor the names of its
20  contributors may be used to endorse or promote products derived from this
21  software without specific prior written permission.
22 
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 
34 */
35 
36 #ifndef HEARTCONFIGDEFAULTS_HPP_
37 #define HEARTCONFIGDEFAULTS_HPP_
38 
90 boost::shared_ptr<cp::chaste_parameters_type> CreateDefaultParameters()
91 {
92  // Simulation parameters
93  cp::simulation_type simulation_params;
94  simulation_params.SpaceDimension().set(3);
95  cp::domain_type domain("Mono");
96  simulation_params.Domain().set(domain);
97  cp::ionic_model_selection_type default_ionic_model;
98  cp::ionic_models_available_type ionic_model("LuoRudyI");
99  default_ionic_model.Hardcoded().set(ionic_model);
100  cp::ionic_models_type ionic_models(default_ionic_model);
101  simulation_params.IonicModels().set(ionic_models);
102  simulation_params.OutputDirectory().set("ChasteResults");
103  simulation_params.OutputFilenamePrefix().set("SimulationResults");
104 
105  // Physiological parameters
106  cp::physiological_type phys_params;
107  XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, intra_conductivities,
108  1.75, 1.75, 1.75, "mS/cm");
109  phys_params.IntracellularConductivities().set(intra_conductivities);
110  XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, extra_conductivities,
111  7.0, 7.0, 7.0, "mS/cm");
112  phys_params.ExtracellularConductivities().set(extra_conductivities);
113  XSD_CREATE_WITH_FIXED_ATTR1(cp::conductivity_type, bath_conductivity, 7.0, "mS/cm");
114  phys_params.BathConductivity().set(bath_conductivity);
115  XSD_CREATE_WITH_FIXED_ATTR1(cp::inverse_length_type, surface_area_to_volume_ratio, 1400, "1/cm");
116  phys_params.SurfaceAreaToVolumeRatio().set(surface_area_to_volume_ratio);
117  XSD_CREATE_WITH_FIXED_ATTR1(cp::capacitance_type, capacitance, 1.0, "uF/cm^2");
118  phys_params.Capacitance().set(capacitance);
119 
120  cp::purkinje_physiological_type purkinje_phys_params;
121  XSD_CREATE_WITH_FIXED_ATTR1(cp::inverse_length_type, purkinje_Am, 2800, "1/cm");
122  purkinje_phys_params.SurfaceAreaToVolumeRatio().set(purkinje_Am);
123  XSD_CREATE_WITH_FIXED_ATTR1(cp::capacitance_type, purkinje_Cm, 1.0, "uF/cm^2");
124  purkinje_phys_params.Capacitance().set(purkinje_Cm);
125  XSD_CREATE_WITH_FIXED_ATTR1(cp::conductivity_type, purkinje_conductivity, 1.75, "mS/cm");
126  purkinje_phys_params.Conductivity().set(purkinje_conductivity);
127  phys_params.Purkinje().set(purkinje_phys_params);
128 
129  // Numerical parameters
130  cp::numerical_type numerical_params;
131  XSD_CREATE_WITH_FIXED_ATTR3(cp::time_steps_type, timesteps, 0.01, 0.01, 0.01, "ms");
132  cp::ksp_tolerances_type tolerances;
133  tolerances.KSPAbsolute().set(2e-4);
134  cp::ksp_solver_type ksp_solver("cg");
135  cp::ksp_preconditioner_type ksp_precond("bjacobi");
136  cp::mesh_partitioning_type mesh_partitioning("parmetis");
137  numerical_params.TimeSteps().set(timesteps);
138  numerical_params.KSPTolerances().set(tolerances);
139  numerical_params.KSPSolver().set(ksp_solver);
140  numerical_params.KSPPreconditioner().set(ksp_precond);
141  numerical_params.MeshPartitioning().set(mesh_partitioning);
142  numerical_params.UseStateVariableInterpolation().set(cp::yesno_type::no);
143 
144  // Postprocessing - empty is equivalent to missing, so don't include it
145  //cp::postprocessing_type postproc;
146 
147  // Full default parameters
148  boost::shared_ptr<cp::chaste_parameters_type> p_defaults(new cp::chaste_parameters_type(phys_params, numerical_params));
149  p_defaults->Simulation().set(simulation_params);
150  //p_defaults->PostProcessing().set(postproc);
151  return p_defaults;
152 }
153 
154 
161 #define MERGE_PARAM(path) \
162  if (!pParams->path().present()) { \
163  if (pDefaults->path().present()) { \
164  pParams->path().set(pDefaults->path().get()); \
165  } \
166  }
167 
172 #define ELSE_IF_DEFAULT(path) \
173  else if (pDefaults->path().present())
174 
184 void MergeDefaults(boost::shared_ptr<cp::chaste_parameters_type> pParams,
185  boost::shared_ptr<cp::chaste_parameters_type> pDefaults)
186 {
187  // Simulation and ResumeSimulation are mutually exclusive
188  if (!pParams->ResumeSimulation().present())
189  {
190  MERGE_PARAM(Simulation)
191  ELSE_IF_DEFAULT(Simulation) // Simulation() exists in both
192  {
193  MERGE_PARAM(Simulation()->SpaceDimension)
194  MERGE_PARAM(Simulation()->Domain)
195  MERGE_PARAM(Simulation()->IonicModels)
196  ELSE_IF_DEFAULT(Simulation()->IonicModels) // Simulation()->IonicModels() exists in both
197  {
198  //MERGE_PARAM(Simulation()->IonicModels()->Default) // This must be present if IonicModels is
199  }
200  MERGE_PARAM(Simulation()->OutputDirectory)
201  MERGE_PARAM(Simulation()->OutputFilenamePrefix)
202  }
203 
204  // Physiological() is mandatory
205  //MERGE_PARAM(Physiological)
206  //ELSE_IF_DEFAULT(Physiological) // Physiological() exists in both
207  {
208  MERGE_PARAM(Physiological().IntracellularConductivities)
209  MERGE_PARAM(Physiological().ExtracellularConductivities)
210  MERGE_PARAM(Physiological().BathConductivity)
211  MERGE_PARAM(Physiological().SurfaceAreaToVolumeRatio)
212  MERGE_PARAM(Physiological().Capacitance)
213  MERGE_PARAM(Physiological().Purkinje)
214  ELSE_IF_DEFAULT(Physiological().Purkinje) // Physiological()->Purkinje() exists in both
215  {
216  MERGE_PARAM(Physiological().Purkinje()->SurfaceAreaToVolumeRatio)
217  MERGE_PARAM(Physiological().Purkinje()->Capacitance)
218  MERGE_PARAM(Physiological().Purkinje()->Conductivity)
219  }
220  }
221 
222  // Numerical() is mandatory
223  //MERGE_PARAM(Numerical)
224  //ELSE_IF_DEFAULT(Numerical) // Numerical() exists in both
225  {
226  MERGE_PARAM(Numerical().TimeSteps)
227  MERGE_PARAM(Numerical().KSPTolerances)
228  ELSE_IF_DEFAULT(Numerical().KSPTolerances) // Numerical()->KSPTolerances() exists in both
229  {
230  // Note that we aren't allowed both absolute and relative tolerances
231  if (!pParams->Numerical().KSPTolerances()->KSPRelative().present())
232  {
233  MERGE_PARAM(Numerical().KSPTolerances()->KSPAbsolute)
234  }
235  }
236  MERGE_PARAM(Numerical().KSPSolver)
237  MERGE_PARAM(Numerical().KSPPreconditioner)
238  MERGE_PARAM(Numerical().MeshPartitioning)
239  MERGE_PARAM(Numerical().UseStateVariableInterpolation)
240  }
241  }
242 }
243 
244 #endif /*HEARTCONFIGDEFAULTS_HPP_*/
#define ELSE_IF_DEFAULT(path)
#define MERGE_PARAM(path)
void MergeDefaults(boost::shared_ptr< cp::chaste_parameters_type > pParams, boost::shared_ptr< cp::chaste_parameters_type > pDefaults)
boost::shared_ptr< cp::chaste_parameters_type > CreateDefaultParameters()