40#include "AbstractChasteRegion.hpp"
41#include "ArchiveLocationInfo.hpp"
42#include "ChastePoint.hpp"
43#include "ChasteXsdVersion.hpp"
45#include "HeartConfig.hpp"
46#include "HeartFileFinder.hpp"
47#include "OutputFileHandler.hpp"
49#include "Warnings.hpp"
51#include "HeartRegionCodes.hpp"
53#include "RegularStimulus.hpp"
54#include "SimpleStimulus.hpp"
62#include <xsd/cxx/tree/exceptions.hxx>
63#include "XmlTools.hpp"
64using namespace xsd::cxx::tree;
67#if CHASTE_XSD_VERSION_AT_LEAST(3, 0, 0)
68#define XSD_SEQUENCE_TYPE(base) base##_sequence
69#define XSD_ITERATOR_TYPE(base) base##_iterator
70#define XSD_NESTED_TYPE(t) t##_type
71#define XSD_ANON_TYPE(t1, t2) \
74#define XSD_SEQUENCE_TYPE(base) base::container
75#define XSD_ITERATOR_TYPE(base) base::iterator
76#define XSD_NESTED_TYPE(t) t::type
77#define XSD_ANON_TYPE(t1, t2) \
78 t1::t2::_xsd_##t2##_::t2
82#define XSD_ANON_SEQUENCE_TYPE(t1, t2, t3) \
83 XSD_SEQUENCE_TYPE(XSD_ANON_TYPE(t1, t2)::t3)
84#define XSD_ANON_ITERATOR_TYPE(t1, t2, t3) \
85 XSD_ITERATOR_TYPE(XSD_ANON_TYPE(t1, t2)::t3)
88#if CHASTE_XSD_VERSION_AT_LEAST(3, 2, 0)
89#define XSD_CREATE_WITH_FIXED_ATTR(type, name, attr) \
91#define XSD_CREATE_WITH_FIXED_ATTR1(type, name, arg1, attr) \
93#define XSD_CREATE_WITH_FIXED_ATTR2(type, name, arg1, arg2, attr) \
95#define XSD_CREATE_WITH_FIXED_ATTR3(type, name, arg1, arg2, arg3, attr) \
96 type name(arg1, arg2, arg3)
98#define XSD_CREATE_WITH_FIXED_ATTR(type, name, attr) \
100#define XSD_CREATE_WITH_FIXED_ATTR1(type, name, arg1, attr) \
101 type name(arg1, attr)
102#define XSD_CREATE_WITH_FIXED_ATTR2(type, name, arg1, arg2, attr) \
103 type name(arg1, arg2, attr)
104#define XSD_CREATE_WITH_FIXED_ATTR3(type, name, arg1, arg2, arg3, attr) \
105 type name(arg1, arg2, arg3, attr)
111#define ENSURE_SECTION_PRESENT(location, type) \
112 if (!location.present()) \
115 location.set(empty_item); \
118#include <boost/current_function.hpp>
126#define CHECK_EXISTS(test, path) \
131 EXCEPTION("No XML element " << path << " found in parameters when calling '" \
132 << BOOST_CURRENT_FUNCTION << "'"); \
151 xercesc::DOMElement* pRootElement);
162 xercesc::DOMElement* pRootElement);
172 xercesc::DOMElement* pRootElement);
182 xercesc::DOMElement* pRootElement);
192 xercesc::DOMElement* pRootElement);
219 : mUseMassLumping(false),
220 mUseMassLumpingForPrecond(false),
221 mUseFixedNumberIterations(false),
222 mEvaluateNumItsEveryNSolves(UINT_MAX)
257 std::string output_dirname;
258 if (useArchiveLocationInfo)
277 out_stream p_parameters_file(
new std::ofstream((output_dirname +
"ChasteParameters.xml").c_str()));
279 if (!p_parameters_file->is_open())
281 EXCEPTION(
"Could not open XML file in HeartConfig");
286 ::xml_schema::namespace_infomap map;
288 map[
""].schema =
"ChasteParameters_1_1.xsd";
290 map[
"cp20"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/2_0";
291 map[
"cp20"].schema =
"ChasteParameters_2_0.xsd";
292 map[
"cp21"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/2_1";
293 map[
"cp21"].schema =
"ChasteParameters_2_1.xsd";
294 map[
"cp22"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/2_2";
295 map[
"cp22"].schema =
"ChasteParameters_2_2.xsd";
296 map[
"cp23"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/2_3";
297 map[
"cp23"].schema =
"ChasteParameters_2_3.xsd";
298 map[
"cp30"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_0";
299 map[
"cp30"].schema =
"ChasteParameters_3_0.xsd";
300 map[
"cp31"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_1";
301 map[
"cp31"].schema =
"ChasteParameters_3_1.xsd";
302 map[
"cp33"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_3";
303 map[
"cp33"].schema =
"ChasteParameters_3_3.xsd";
304 map[
"cp34"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_4";
305 map[
"cp34"].schema =
"ChasteParameters_3_4.xsd";
308 map[
"cp"].name =
"https://chaste.comlab.ox.ac.uk/nss/parameters/2017_1";
309 map[
"cp"].schema =
"ChasteParameters_2017_1.xsd";
311 cp::ChasteParameters(*p_parameters_file, *
mpParameters, map);
314 if (useArchiveLocationInfo)
332 boost::shared_ptr<cp::chaste_parameters_type> p_new_parameters =
mpParameters;
348 if (
FileFinder(defaults_filename_xml).Exists())
350 boost::shared_ptr<cp::chaste_parameters_type> p_defaults =
ReadFile(defaults_filename_xml);
357 if (p_new_parameters->ResumeSimulation().present())
371 std::string schema_name(
"ChasteParameters_2017_1.xsd");
373 if (!schema_location.
Exists())
377 if (!schema_location.
Exists())
380 std::string message(
"Unable to locate schema file " + schema_name +
". You will need to ensure it is available when resuming from the checkpoint.");
381 WARN_ONCE_ONLY(message);
384 if (schema_location.
Exists())
387 schema_location.
CopyTo(output_directory);
399 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/2_0"] = root_dir +
"ChasteParameters_2_0.xsd";
400 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/2_1"] = root_dir +
"ChasteParameters_2_1.xsd";
401 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/2_2"] = root_dir +
"ChasteParameters_2_2.xsd";
402 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/2_3"] = root_dir +
"ChasteParameters_2_3.xsd";
403 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_0"] = root_dir +
"ChasteParameters_3_0.xsd";
404 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_1"] = root_dir +
"ChasteParameters_3_1.xsd";
405 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_3"] = root_dir +
"ChasteParameters_3_3.xsd";
406 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_4"] = root_dir +
"ChasteParameters_3_4.xsd";
407 mSchemaLocations[
"https://chaste.comlab.ox.ac.uk/nss/parameters/2017_1"] = root_dir +
"ChasteParameters_2017_1.xsd";
412 unsigned version_major = 0;
413 unsigned version_minor = 0;
414 if (rNamespaceUri ==
"")
421 std::string uri_base(
"https://chaste.comlab.ox.ac.uk/nss/parameters/");
422 if (rNamespaceUri.substr(0, uri_base.length()) == uri_base)
424 std::istringstream version_string(rNamespaceUri.substr(uri_base.length()));
425 version_string >> version_major;
426 version_string.ignore(1);
427 version_string >> version_minor;
428 if (version_string.fail())
436 unsigned version = version_major * 1000 + version_minor;
439 EXCEPTION(rNamespaceUri +
" is not a recognised Chaste parameters namespace.");
458 ::xml_schema::properties props;
485 xercesc::DOMElement* p_root_elt = p_doc->getDocumentElement();
486 std::string namespace_uri(X2C(p_root_elt->getNamespaceURI()));
509 if (version < 2017001)
514 boost::shared_ptr<cp::chaste_parameters_type> p_params(cp::ChasteParameters(*p_doc, ::xml_schema::flags::dont_initialize, props));
518 return boost::shared_ptr<cp::chaste_parameters_type>(p_params);
520 catch (
const xml_schema::exception& e)
522 std::cerr << e << std::endl;
525 EXCEPTION(
"XML parsing error in configuration file: " + rFileName);
558 EXCEPTION(
"Problem type and space dimension should match when restarting a simulation.");
565 if (pResumeParameters->ResumeSimulation()->Stimuli().present())
567 mpParameters->Simulation()->Stimuli().set(pResumeParameters->ResumeSimulation()->Stimuli().get());
572 if (pResumeParameters->ResumeSimulation()->CellHeterogeneities().present())
574 if (!
mpParameters->Simulation()->CellHeterogeneities().present())
577 mpParameters->Simulation()->CellHeterogeneities().set(pResumeParameters->ResumeSimulation()->CellHeterogeneities().get());
582 XSD_SEQUENCE_TYPE(cp::cell_heterogeneities_type::CellHeterogeneity)& new_seq = pResumeParameters->ResumeSimulation()->CellHeterogeneities()->CellHeterogeneity();
583 XSD_SEQUENCE_TYPE(cp::cell_heterogeneities_type::CellHeterogeneity)& orig_seq =
mpParameters->Simulation()->CellHeterogeneities()->CellHeterogeneity();
584 for (XSD_ITERATOR_TYPE(cp::cell_heterogeneities_type::CellHeterogeneity) i = new_seq.begin();
588 orig_seq.push_back(*i);
594 if (pResumeParameters->ResumeSimulation()->CheckpointSimulation().present())
597 pResumeParameters->ResumeSimulation()->CheckpointSimulation()->timestep(),
598 pResumeParameters->ResumeSimulation()->CheckpointSimulation()->max_checkpoints_on_disk());
602 if (pResumeParameters->ResumeSimulation()->OutputVisualizer().present())
612 cp::numerical_type& r_resume = pResumeParameters->Numerical();
614 if (r_resume.TimeSteps().present())
616 r_user.TimeSteps().set(r_resume.TimeSteps().get());
618 if (r_resume.KSPTolerances().present())
620 r_user.KSPTolerances().set(r_resume.KSPTolerances().get());
622 if (r_resume.KSPSolver().present())
624 r_user.KSPSolver().set(r_resume.KSPSolver().get());
626 if (r_resume.KSPPreconditioner().present())
628 r_user.KSPPreconditioner().set(r_resume.KSPPreconditioner().get());
630 if (r_resume.AdaptivityParameters().present())
632 r_user.AdaptivityParameters().set(r_resume.AdaptivityParameters().get());
637 if (pResumeParameters->PostProcessing().present())
640 cp::postprocessing_type& r_resume = pResumeParameters->PostProcessing().get();
641 cp::postprocessing_type& r_user =
mpParameters->PostProcessing().get();
642 if (!r_resume.ActionPotentialDurationMap().empty())
644 r_user.ActionPotentialDurationMap() = r_resume.ActionPotentialDurationMap();
646 if (!r_resume.UpstrokeTimeMap().empty())
648 r_user.UpstrokeTimeMap() = r_resume.UpstrokeTimeMap();
650 if (!r_resume.MaxUpstrokeVelocityMap().empty())
652 r_user.MaxUpstrokeVelocityMap() = r_resume.MaxUpstrokeVelocityMap();
654 if (!r_resume.ConductionVelocityMap().empty())
656 r_user.ConductionVelocityMap() = r_resume.ConductionVelocityMap();
658 if (!r_resume.PseudoEcgElectrodePosition().empty())
660 r_user.PseudoEcgElectrodePosition() = r_resume.PseudoEcgElectrodePosition();
687 EXCEPTION(callingMethod +
" information is not available in a resumed simulation.");
695 EXCEPTION(callingMethod +
" information is not available in a standard (non-resumed) simulation.");
703 CHECK_EXISTS(
mpParameters->Simulation()->SpaceDimension().present(),
"Simulation/SpaceDimension");
704 return mpParameters->Simulation()->SpaceDimension().get();
708 return mpParameters->ResumeSimulation()->SpaceDimension();
716 CHECK_EXISTS(
mpParameters->Simulation()->SimulationDuration().present(),
"Simulation/SimulationDuration");
717 return mpParameters->Simulation()->SimulationDuration().get();
721 return mpParameters->ResumeSimulation()->SimulationDuration();
729 CHECK_EXISTS(
mpParameters->Simulation()->Domain().present(),
"Simulation/Domain");
742 return mpParameters->Simulation()->IonicModels()->Default();
745template <
unsigned DIM>
747 std::vector<cp::ionic_model_selection_type>& ionicModels)
const
750 definedRegions.clear();
753 XSD_SEQUENCE_TYPE(cp::ionic_models_type::Region)& regions =
mpParameters->Simulation()->IonicModels()->Region();
755 for (XSD_ITERATOR_TYPE(cp::ionic_models_type::Region) i = regions.begin();
759 cp::ionic_model_region_type ionic_model_region(*i);
761 if (ionic_model_region.Location().Cuboid().present() || ionic_model_region.Location().Ellipsoid().present())
763 if (ionic_model_region.Location().Cuboid().present())
765 cp::point_type point_a = ionic_model_region.Location().Cuboid()->LowerCoordinates();
766 cp::point_type point_b = ionic_model_region.Location().Cuboid()->UpperCoordinates();
796 else if (ionic_model_region.Location().Ellipsoid().present())
798 cp::point_type centre = ionic_model_region.Location().Ellipsoid()->Centre();
799 cp::point_type radii = ionic_model_region.Location().Ellipsoid()->Radii();
835 ionicModels.push_back(ionic_model_region.IonicModel());
837 else if (ionic_model_region.Location().EpiLayer().present() || ionic_model_region.Location().MidLayer().present() || ionic_model_region.Location().EndoLayer().present())
840 EXCEPTION(
"Definition of transmural layers is not yet supported for defining different ionic models, please use cuboids instead");
844 EXCEPTION(
"Invalid region type for ionic model definition");
860 return (
mesh.Slab().present() ||
mesh.Sheet().present() ||
mesh.Fibre().present());
868 return (
mesh.Slab().present());
876 return (
mesh.Sheet().present());
884 return (
mesh.Fibre().present());
891 return (
mpParameters->Simulation()->Mesh()->LoadMesh().present());
900 EXCEPTION(
"Tissue slabs can only be defined in 3D");
903 optional<cp::slab_type, false> slab_dimensions =
mpParameters->Simulation()->Mesh()->Slab();
905 slabDimensions[0] = slab_dimensions->x();
906 slabDimensions[1] = slab_dimensions->y();
907 slabDimensions[2] = slab_dimensions->z();
916 EXCEPTION(
"Tissue sheets can only be defined in 2D");
919 optional<cp::sheet_type, false> sheet_dimensions =
mpParameters->Simulation()->Mesh()->Sheet();
921 sheetDimensions[0] = sheet_dimensions->x();
922 sheetDimensions[1] = sheet_dimensions->y();
931 EXCEPTION(
"Tissue fibres can only be defined in 1D");
934 optional<cp::fibre_type, false> fibre_length =
mpParameters->Simulation()->Mesh()->Fibre();
936 fibreLength[0] = fibre_length->x();
947 return mpParameters->Simulation()->Mesh()->Slab()->inter_node_space();
951 return mpParameters->Simulation()->Mesh()->Sheet()->inter_node_space();
955 return mpParameters->Simulation()->Mesh()->Fibre()->inter_node_space();
970 return mpParameters->Simulation()->Mesh()->LoadMesh()->name();
978 return mpParameters->Simulation()->Mesh()->LoadMesh()->conductivity_media();
981template <
unsigned DIM>
994 XSD_SEQUENCE_TYPE(cp::stimuli_type::Stimulus)
995 stimuli =
mpParameters->Simulation()->Stimuli()->Stimulus();
997 for (XSD_ITERATOR_TYPE(cp::stimuli_type::Stimulus) i = stimuli.begin();
1001 cp::stimulus_type stimulus(*i);
1002 if (stimulus.Location().Cuboid().present() || stimulus.Location().Ellipsoid().present())
1004 boost::shared_ptr<AbstractChasteRegion<DIM> > area_ptr;
1005 if (stimulus.Location().Cuboid().present())
1007 cp::point_type point_a = stimulus.Location().Cuboid()->LowerCoordinates();
1008 cp::point_type point_b = stimulus.Location().Cuboid()->UpperCoordinates();
1037 else if (stimulus.Location().Ellipsoid().present())
1039 cp::point_type centre = stimulus.Location().Ellipsoid()->Centre();
1040 cp::point_type radii = stimulus.Location().Ellipsoid()->Radii();
1071 rStimulatedAreas.push_back(area_ptr);
1073 boost::shared_ptr<AbstractStimulusFunction> stim;
1075 if (stimulus.Period().present())
1077 if (stimulus.StopTime().present())
1080 stimulus.Duration(),
1081 stimulus.Period().get(),
1083 stimulus.StopTime().get()));
1088 stimulus.Duration(),
1089 stimulus.Period().get(),
1095 if (stimulus.StopTime().present())
1097 EXCEPTION(
"Stop time can not be defined for SimpleStimulus. Use Duration instead.");
1101 stimulus.Duration(),
1104 rStimuliApplied.push_back(stim);
1106 else if (stimulus.Location().EpiLayer().present() || stimulus.Location().MidLayer().present() || stimulus.Location().EndoLayer().present())
1108 EXCEPTION(
"Definition of transmural layers is not yet supported for specifying stimulated areas, please use cuboids instead");
1112 EXCEPTION(
"Invalid region type for stimulus definition");
1117template <
unsigned DIM>
1119 std::vector<double>& rScaleFactorGks,
1120 std::vector<double>& rScaleFactorIto,
1121 std::vector<double>& rScaleFactorGkr,
1122 std::vector<std::map<std::string, double> >* pParameterSettings)
1126 if (!
mpParameters->Simulation()->CellHeterogeneities().present())
1131 XSD_SEQUENCE_TYPE(cp::cell_heterogeneities_type::CellHeterogeneity)
1133 =
mpParameters->Simulation()->CellHeterogeneities()->CellHeterogeneity();
1135 bool user_supplied_negative_value =
false;
1137 bool user_asked_for_cuboids_or_ellipsoids =
false;
1138 unsigned counter_of_heterogeneities = 0;
1140 for (XSD_ITERATOR_TYPE(cp::cell_heterogeneities_type::CellHeterogeneity) i = cell_heterogeneity.begin();
1141 i != cell_heterogeneity.end();
1144 cp::cell_heterogeneity_type ht(*i);
1146 if (ht.Location().Cuboid().present())
1148 user_asked_for_cuboids_or_ellipsoids =
true;
1149 cp::point_type point_a = ht.Location().Cuboid()->LowerCoordinates();
1150 cp::point_type point_b = ht.Location().Cuboid()->UpperCoordinates();
1157 else if (ht.Location().Ellipsoid().present())
1159 user_asked_for_cuboids_or_ellipsoids =
true;
1160 cp::point_type centre = ht.Location().Ellipsoid()->Centre();
1161 cp::point_type radii = ht.Location().Ellipsoid()->Radii();
1167 else if (ht.Location().EpiLayer().present())
1174 user_supplied_negative_value =
true;
1178 else if (ht.Location().EndoLayer().present())
1185 user_supplied_negative_value =
true;
1189 else if (ht.Location().MidLayer().present())
1196 user_supplied_negative_value =
true;
1202 EXCEPTION(
"Invalid region type for cell heterogeneity definition");
1206 rScaleFactorGks.push_back(ht.ScaleFactorGks().present() ? (
double)ht.ScaleFactorGks().get() : 1.0);
1207 rScaleFactorIto.push_back(ht.ScaleFactorIto().present() ? (
double)ht.ScaleFactorIto().get() : 1.0);
1208 rScaleFactorGkr.push_back(ht.ScaleFactorGkr().present() ? (
double)ht.ScaleFactorGkr().get() : 1.0);
1211 if (pParameterSettings)
1213 std::map<std::string, double> param_settings;
1214 XSD_SEQUENCE_TYPE(cp::cell_heterogeneity_type::SetParameter)& params = ht.SetParameter();
1215 for (XSD_ITERATOR_TYPE(cp::cell_heterogeneity_type::SetParameter) param_it = params.begin();
1216 param_it != params.end();
1219 cp::set_parameter_type param(*param_it);
1220 param_settings[param.name()] = param.value();
1222 pParameterSettings->push_back(param_settings);
1225 counter_of_heterogeneities++;
1231 if (user_asked_for_cuboids_or_ellipsoids)
1233 EXCEPTION(
"Specification of cellular heterogeneities by cuboids/ellipsoids and layers at the same time is not yet supported");
1241 EXCEPTION(
"Three specifications of layers must be supplied");
1245 EXCEPTION(
"Summation of epicardial, midmyocardial and endocardial fractions should be 1");
1247 if (user_supplied_negative_value)
1249 EXCEPTION(
"Fractions must be positive");
1292 return mpParameters->Physiological().ConductivityHeterogeneities().present();
1295template <
unsigned DIM>
1298 std::vector<c_vector<double, 3> >& rIntraConductivities,
1299 std::vector<c_vector<double, 3> >& rExtraConductivities)
const
1303 XSD_ANON_SEQUENCE_TYPE(cp::physiological_type, ConductivityHeterogeneities, ConductivityHeterogeneity)& conductivity_heterogeneity =
mpParameters->Physiological().ConductivityHeterogeneities()->ConductivityHeterogeneity();
1305 for (XSD_ANON_ITERATOR_TYPE(cp::physiological_type, ConductivityHeterogeneities, ConductivityHeterogeneity) i = conductivity_heterogeneity.begin();
1306 i != conductivity_heterogeneity.end();
1309 cp::conductivity_heterogeneity_type ht(*i);
1311 if (ht.Location().Cuboid().present())
1313 cp::point_type point_a = ht.Location().Cuboid()->LowerCoordinates();
1314 cp::point_type point_b = ht.Location().Cuboid()->UpperCoordinates();
1319 else if (ht.Location().Ellipsoid().present())
1321 cp::point_type centre = ht.Location().Ellipsoid()->Centre();
1322 cp::point_type radii = ht.Location().Ellipsoid()->Radii();
1327 else if (ht.Location().EpiLayer().present() || ht.Location().MidLayer().present() || ht.Location().EndoLayer().present())
1330 EXCEPTION(
"Definition of transmural layers is not allowed for conductivities heterogeneities, you may use fibre orientation support instead");
1334 EXCEPTION(
"Invalid region type for conductivity definition");
1337 if (ht.IntracellularConductivities().present())
1339 double intra_x = ht.IntracellularConductivities()->longi();
1340 double intra_y = ht.IntracellularConductivities()->trans();
1341 double intra_z = ht.IntracellularConductivities()->normal();
1343 rIntraConductivities.push_back(Create_c_vector(intra_x, intra_y, intra_z));
1347 c_vector<double, 3> intra_conductivities;
1349 rIntraConductivities.push_back(intra_conductivities);
1352 if (ht.ExtracellularConductivities().present())
1354 double extra_x = ht.ExtracellularConductivities()->longi();
1355 double extra_y = ht.ExtracellularConductivities()->trans();
1356 double extra_z = ht.ExtracellularConductivities()->normal();
1358 rExtraConductivities.push_back(Create_c_vector(extra_x, extra_y, extra_z));
1362 c_vector<double, 3> extra_conductivities;
1364 rExtraConductivities.push_back(extra_conductivities);
1372 CHECK_EXISTS(
mpParameters->Simulation()->OutputDirectory().present(),
"Simulation/OutputDirectory");
1373 return mpParameters->Simulation()->OutputDirectory().get();
1379 CHECK_EXISTS(
mpParameters->Simulation()->OutputFilenamePrefix().present(),
"Simulation/OutputFilenamePrefix");
1380 return mpParameters->Simulation()->OutputFilenamePrefix().get();
1386 return mpParameters->Simulation()->OutputVariables().present();
1392 XSD_SEQUENCE_TYPE(cp::output_variables_type::Var)& output_variables =
mpParameters->Simulation()->OutputVariables()->Var();
1393 rOutputVariables.clear();
1395 for (XSD_ITERATOR_TYPE(cp::output_variables_type::Var) i = output_variables.begin();
1396 i != output_variables.end();
1399 cp::var_type& r_var(*i);
1402 rOutputVariables.push_back(r_var.name());
1409 bool result =
false;
1410 if (
mpParameters->Simulation()->OutputUsingOriginalNodeOrdering().present())
1412 result = (
mpParameters->Simulation()->OutputUsingOriginalNodeOrdering().get() == cp::yesno_type::yes);
1425 return mpParameters->Simulation()->CheckpointSimulation()->timestep();
1431 return mpParameters->Simulation()->CheckpointSimulation()->max_checkpoints_on_disk();
1443 CHECK_EXISTS(
mpParameters->Physiological().IntracellularConductivities().present(),
"Physiological/IntracellularConductivities");
1444 cp::conductivities_type intra_conductivities
1445 =
mpParameters->Physiological().IntracellularConductivities().get();
1446 double intra_x_cond = intra_conductivities.longi();
1447 double intra_y_cond = intra_conductivities.trans();
1448 double intra_z_cond = intra_conductivities.normal();
1451 assert(intra_y_cond != DBL_MAX);
1452 assert(intra_z_cond != DBL_MAX);
1454 rIntraConductivities[0] = intra_x_cond;
1455 rIntraConductivities[1] = intra_y_cond;
1456 rIntraConductivities[2] = intra_z_cond;
1461 CHECK_EXISTS(
mpParameters->Physiological().IntracellularConductivities().present(),
"Physiological/IntracellularConductivities");
1462 cp::conductivities_type intra_conductivities
1463 =
mpParameters->Physiological().IntracellularConductivities().get();
1464 double intra_x_cond = intra_conductivities.longi();
1465 double intra_y_cond = intra_conductivities.trans();
1467 assert(intra_y_cond != DBL_MAX);
1469 rIntraConductivities[0] = intra_x_cond;
1470 rIntraConductivities[1] = intra_y_cond;
1475 CHECK_EXISTS(
mpParameters->Physiological().IntracellularConductivities().present(),
"Physiological/IntracellularConductivities");
1476 cp::conductivities_type intra_conductivities
1477 =
mpParameters->Physiological().IntracellularConductivities().get();
1478 double intra_x_cond = intra_conductivities.longi();
1480 rIntraConductivities[0] = intra_x_cond;
1485 CHECK_EXISTS(
mpParameters->Physiological().ExtracellularConductivities().present(),
"Physiological/ExtracellularConductivities");
1486 cp::conductivities_type extra_conductivities
1487 =
mpParameters->Physiological().ExtracellularConductivities().get();
1488 double extra_x_cond = extra_conductivities.longi();
1489 double extra_y_cond = extra_conductivities.trans();
1490 double extra_z_cond = extra_conductivities.normal();
1493 assert(extra_y_cond != DBL_MAX);
1494 assert(extra_z_cond != DBL_MAX);
1496 rExtraConductivities[0] = extra_x_cond;
1497 rExtraConductivities[1] = extra_y_cond;
1498 rExtraConductivities[2] = extra_z_cond;
1503 CHECK_EXISTS(
mpParameters->Physiological().ExtracellularConductivities().present(),
"Physiological/ExtracellularConductivities");
1504 cp::conductivities_type extra_conductivities
1505 =
mpParameters->Physiological().ExtracellularConductivities().get();
1506 double extra_x_cond = extra_conductivities.longi();
1507 double extra_y_cond = extra_conductivities.trans();
1509 assert(extra_y_cond != DBL_MAX);
1511 rExtraConductivities[0] = extra_x_cond;
1512 rExtraConductivities[1] = extra_y_cond;
1517 CHECK_EXISTS(
mpParameters->Physiological().ExtracellularConductivities().present(),
"Physiological/ExtracellularConductivities");
1518 cp::conductivities_type extra_conductivities
1519 =
mpParameters->Physiological().ExtracellularConductivities().get();
1520 double extra_x_cond = extra_conductivities.longi();
1522 rExtraConductivities[0] = extra_x_cond;
1536 if (bathRegion == UINT_MAX)
1539 CHECK_EXISTS(
mpParameters->Physiological().BathConductivity().present(),
"Physiological/BathConductivity");
1540 return mpParameters->Physiological().BathConductivity().get();
1546 std::map<unsigned, double>::const_iterator map_entry =
mBathConductivities.find(bathRegion);
1550 return map_entry->second;
1555 CHECK_EXISTS(
mpParameters->Physiological().BathConductivity().present(),
"Physiological/BathConductivity");
1556 return mpParameters->Physiological().BathConductivity().get();
1572 CHECK_EXISTS(
mpParameters->Physiological().SurfaceAreaToVolumeRatio().present(),
"Physiological/SurfaceAreaToVolumeRatio");
1573 return mpParameters->Physiological().SurfaceAreaToVolumeRatio().get();
1578 CHECK_EXISTS(
mpParameters->Physiological().Capacitance().present(),
"Physiological/Capacitance");
1579 return mpParameters->Physiological().Capacitance().get();
1584 CHECK_EXISTS(
mpParameters->Numerical().TimeSteps().present(),
"Numerical/TimeSteps");
1590 CHECK_EXISTS(
mpParameters->Numerical().TimeSteps().present(),
"Numerical/TimeSteps");
1596 CHECK_EXISTS(
mpParameters->Numerical().TimeSteps().present(),
"Numerical/TimeSteps");
1597 return mpParameters->Numerical().TimeSteps()->printing();
1602 CHECK_EXISTS(
mpParameters->Numerical().KSPTolerances().present(),
"Numerical/KSPTolerances");
1603 return mpParameters->Numerical().KSPTolerances()->KSPAbsolute().present();
1608 CHECK_EXISTS(
mpParameters->Numerical().KSPTolerances().present(),
"Numerical/KSPTolerances");
1611 EXCEPTION(
"Absolute tolerance is not set in Chaste parameters");
1613 return mpParameters->Numerical().KSPTolerances()->KSPAbsolute().get();
1618 CHECK_EXISTS(
mpParameters->Numerical().KSPTolerances().present(),
"Numerical/KSPTolerances");
1619 return mpParameters->Numerical().KSPTolerances()->KSPRelative().present();
1624 CHECK_EXISTS(
mpParameters->Numerical().KSPTolerances().present(),
"Numerical/KSPTolerances");
1627 EXCEPTION(
"Relative tolerance is not set in Chaste parameters");
1629 return mpParameters->Numerical().KSPTolerances()->KSPRelative().get();
1634 CHECK_EXISTS(
mpParameters->Numerical().KSPSolver().present(),
"Numerical/KSPSolver");
1637 case cp::ksp_solver_type::gmres:
1639 case cp::ksp_solver_type::cg:
1641 case cp::ksp_solver_type::symmlq:
1643 case cp::ksp_solver_type::chebychev:
1653 CHECK_EXISTS(
mpParameters->Numerical().KSPPreconditioner().present(),
"Numerical/KSPPreconditioner");
1654 switch (
mpParameters->Numerical().KSPPreconditioner().get())
1656 case cp::ksp_preconditioner_type::jacobi:
1658 case cp::ksp_preconditioner_type::bjacobi:
1660 case cp::ksp_preconditioner_type::hypre:
1662 case cp::ksp_preconditioner_type::ml:
1664 case cp::ksp_preconditioner_type::spai:
1666 case cp::ksp_preconditioner_type::blockdiagonal:
1667 return "blockdiagonal";
1668 case cp::ksp_preconditioner_type::ldufactorisation:
1669 return "ldufactorisation";
1670 case cp::ksp_preconditioner_type::twolevelsblockdiagonal:
1671 return "twolevelsblockdiagonal";
1672 case cp::ksp_preconditioner_type::none:
1676 EXCEPTION(
"Unknown ksp preconditioner");
1682 CHECK_EXISTS(
mpParameters->Numerical().MeshPartitioning().present(),
"Numerical/MeshPartitioning");
1683 switch (
mpParameters->Numerical().MeshPartitioning().get())
1685 case cp::mesh_partitioning_type::dumb:
1686 return DistributedTetrahedralMeshPartitionType::DUMB;
1687 case cp::mesh_partitioning_type::metis:
1688 return DistributedTetrahedralMeshPartitionType::METIS_LIBRARY;
1689 case cp::mesh_partitioning_type::parmetis:
1690 return DistributedTetrahedralMeshPartitionType::PARMETIS_LIBRARY;
1691 case cp::mesh_partitioning_type::petsc:
1692 return DistributedTetrahedralMeshPartitionType::PETSC_MAT_PARTITION;
1695 EXCEPTION(
"Unknown mesh partitioning type");
1704 WARNING(
"Use of the Adaptivity library is deprecated");
1720 ENSURE_SECTION_PRESENT(
mpParameters->PostProcessing(), cp::postprocessing_type);
1736 bool result =
false;
1739 XSD_SEQUENCE_TYPE(cp::postprocessing_type::ActionPotentialDurationMap)& apd_maps =
mpParameters->PostProcessing()->ActionPotentialDurationMap();
1740 result = (apd_maps.begin() != apd_maps.end());
1750 XSD_SEQUENCE_TYPE(cp::postprocessing_type::ActionPotentialDurationMap)& apd_maps_sequence =
mpParameters->PostProcessing()->ActionPotentialDurationMap();
1752 for (XSD_ITERATOR_TYPE(cp::postprocessing_type::ActionPotentialDurationMap) i = apd_maps_sequence.begin();
1753 i != apd_maps_sequence.end();
1756 std::pair<double, double> map(i->repolarisation_percentage(), i->threshold());
1758 apd_maps.push_back(map);
1764 bool result =
false;
1767 XSD_SEQUENCE_TYPE(cp::postprocessing_type::UpstrokeTimeMap)& upstroke_map =
mpParameters->PostProcessing()->UpstrokeTimeMap();
1768 result = (upstroke_map.begin() != upstroke_map.end());
1775 assert(upstroke_time_maps.size() == 0);
1777 XSD_SEQUENCE_TYPE(cp::postprocessing_type::UpstrokeTimeMap)& upstroke_maps_sequence =
mpParameters->PostProcessing()->UpstrokeTimeMap();
1779 for (XSD_ITERATOR_TYPE(cp::postprocessing_type::UpstrokeTimeMap) i = upstroke_maps_sequence.begin();
1780 i != upstroke_maps_sequence.end();
1783 upstroke_time_maps.push_back(i->threshold());
1789 bool result =
false;
1792 XSD_SEQUENCE_TYPE(cp::postprocessing_type::MaxUpstrokeVelocityMap)& max_upstroke_velocity_map =
mpParameters->PostProcessing()->MaxUpstrokeVelocityMap();
1793 result = (max_upstroke_velocity_map.begin() != max_upstroke_velocity_map.end());
1801 assert(upstroke_velocity_maps.size() == 0);
1803 XSD_SEQUENCE_TYPE(cp::postprocessing_type::MaxUpstrokeVelocityMap)& max_upstroke_velocity_maps_sequence =
mpParameters->PostProcessing()->MaxUpstrokeVelocityMap();
1805 for (XSD_ITERATOR_TYPE(cp::postprocessing_type::MaxUpstrokeVelocityMap) i = max_upstroke_velocity_maps_sequence.begin();
1806 i != max_upstroke_velocity_maps_sequence.end();
1809 upstroke_velocity_maps.push_back(i->threshold());
1815 bool result =
false;
1818 XSD_SEQUENCE_TYPE(cp::postprocessing_type::ConductionVelocityMap)& cond_vel_maps =
mpParameters->PostProcessing()->ConductionVelocityMap();
1819 result = (cond_vel_maps.begin() != cond_vel_maps.end());
1827 assert(conduction_velocity_maps.size() == 0);
1829 XSD_SEQUENCE_TYPE(cp::postprocessing_type::ConductionVelocityMap)& cond_vel_maps_sequence =
mpParameters->PostProcessing()->ConductionVelocityMap();
1831 for (XSD_ITERATOR_TYPE(cp::postprocessing_type::ConductionVelocityMap) i = cond_vel_maps_sequence.begin();
1832 i != cond_vel_maps_sequence.end();
1835 conduction_velocity_maps.push_back(i->origin_node());
1841 bool result =
false;
1844 XSD_SEQUENCE_TYPE(cp::postprocessing_type::TimeTraceAtNode)& requested_nodes =
mpParameters->PostProcessing()->TimeTraceAtNode();
1845 result = (requested_nodes.begin() != requested_nodes.end());
1853 assert(rRequestedNodes.size() == 0);
1855 XSD_SEQUENCE_TYPE(cp::postprocessing_type::TimeTraceAtNode)& req_nodes =
mpParameters->PostProcessing()->TimeTraceAtNode();
1857 for (XSD_ITERATOR_TYPE(cp::postprocessing_type::TimeTraceAtNode) i = req_nodes.begin();
1858 i != req_nodes.end();
1861 rRequestedNodes.push_back(i->node_number());
1867 bool result =
false;
1870 XSD_SEQUENCE_TYPE(cp::postprocessing_type::PseudoEcgElectrodePosition)& electrodes =
mpParameters->PostProcessing()->PseudoEcgElectrodePosition();
1871 result = (electrodes.begin() != electrodes.end());
1876template <
unsigned SPACE_DIM>
1879 rPseudoEcgElectrodePositions.clear();
1880 XSD_SEQUENCE_TYPE(cp::postprocessing_type::PseudoEcgElectrodePosition)& electrodes =
mpParameters->PostProcessing()->PseudoEcgElectrodePosition();
1881 for (XSD_ITERATOR_TYPE(cp::postprocessing_type::PseudoEcgElectrodePosition) i = electrodes.begin();
1882 i != electrodes.end();
1897 return mpParameters->Simulation()->OutputVisualizer().present();
1908 return mpParameters->Simulation()->OutputVisualizer()->meshalyzer() == cp::yesno_type::yes;
1920 return mpParameters->Simulation()->OutputVisualizer()->cmgui() == cp::yesno_type::yes;
1932 return mpParameters->Simulation()->OutputVisualizer()->parallel_vtk() == cp::yesno_type::yes;
1944 return mpParameters->Simulation()->OutputVisualizer()->vtk() == cp::yesno_type::yes;
1956 return mpParameters->Simulation()->OutputVisualizer()->precision();
1962 return mpParameters->Simulation()->Electrodes().present();
1970 mpParameters->Simulation()->SpaceDimension().set(spaceDimension);
1975 XSD_CREATE_WITH_FIXED_ATTR1(cp::time_type, time, simulationDuration,
"ms");
1976 mpParameters->Simulation()->SimulationDuration().set(time);
1986 cp::ionic_model_selection_type ionic_model;
1987 ionic_model.Hardcoded(rIonicModel);
1988 cp::ionic_models_type container(ionic_model);
1989 mpParameters->Simulation()->IonicModels().set(container);
1996 XSD_CREATE_WITH_FIXED_ATTR(cp::mesh_type, mesh_to_load,
"cm");
2000 cp::slab_type slab_definition(x, y, z, inter_node_space);
2001 mpParameters->Simulation()->Mesh()->Slab().set(slab_definition);
2008 XSD_CREATE_WITH_FIXED_ATTR(cp::mesh_type, mesh_to_load,
"cm");
2012 cp::sheet_type sheet_definition(x, y, inter_node_space);
2013 mpParameters->Simulation()->Mesh()->Sheet().set(sheet_definition);
2020 XSD_CREATE_WITH_FIXED_ATTR(cp::mesh_type, mesh_to_load,
"cm");
2024 cp::fibre_type fibre_definition(x, inter_node_space);
2025 mpParameters->Simulation()->Mesh()->Fibre().set(fibre_definition);
2032 XSD_CREATE_WITH_FIXED_ATTR(cp::mesh_type, mesh_to_load,
"cm");
2036 XSD_NESTED_TYPE(cp::mesh_type::LoadMesh)
2037 mesh_prefix(meshPrefix, fibreDefinition);
2038 mpParameters->Simulation()->Mesh()->LoadMesh().set(mesh_prefix);
2042 std::vector<cp::ionic_model_selection_type>& rIonicModels)
const
2044 assert(rDefinedRegions.size() == rIonicModels.size());
2046 assert(
mpParameters->Simulation()->IonicModels().present());
2047 XSD_SEQUENCE_TYPE(cp::ionic_models_type::Region)& regions =
mpParameters->Simulation()->IonicModels()->Region();
2049 for (
unsigned region_index = 0; region_index < rDefinedRegions.size(); region_index++)
2051 cp::point_type point_a(rDefinedRegions[region_index].rGetLowerCorner()[0],
2052 rDefinedRegions[region_index].rGetLowerCorner()[1],
2053 rDefinedRegions[region_index].rGetLowerCorner()[2]);
2055 cp::point_type point_b(rDefinedRegions[region_index].rGetUpperCorner()[0],
2056 rDefinedRegions[region_index].rGetUpperCorner()[1],
2057 rDefinedRegions[region_index].rGetUpperCorner()[2]);
2059 XSD_CREATE_WITH_FIXED_ATTR(cp::location_type, locn,
"cm");
2060 locn.Cuboid().set(cp::box_type(point_a, point_b));
2062 cp::ionic_model_region_type region(rIonicModels[region_index], locn);
2063 regions.push_back(region);
2068 std::vector<c_vector<double, 3> >& rIntraConductivities,
2069 std::vector<c_vector<double, 3> >& rExtraConductivities)
2071 assert(rConductivityAreas.size() == rIntraConductivities.size());
2072 assert(rIntraConductivities.size() == rExtraConductivities.size());
2074 XSD_ANON_SEQUENCE_TYPE(cp::physiological_type, ConductivityHeterogeneities, ConductivityHeterogeneity)
2075 heterogeneities_container;
2077 for (
unsigned region_index = 0; region_index < rConductivityAreas.size(); region_index++)
2079 cp::point_type point_a(rConductivityAreas[region_index].rGetLowerCorner()[0],
2080 rConductivityAreas[region_index].rGetLowerCorner()[1],
2081 rConductivityAreas[region_index].rGetLowerCorner()[2]);
2083 cp::point_type point_b(rConductivityAreas[region_index].rGetUpperCorner()[0],
2084 rConductivityAreas[region_index].rGetUpperCorner()[1],
2085 rConductivityAreas[region_index].rGetUpperCorner()[2]);
2087 XSD_CREATE_WITH_FIXED_ATTR(cp::location_type, locn,
"cm");
2088 locn.Cuboid().set(cp::box_type(point_a, point_b));
2089 cp::conductivity_heterogeneity_type ht(locn);
2091 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, intra,
2092 rIntraConductivities[region_index][0],
2093 rIntraConductivities[region_index][1],
2094 rIntraConductivities[region_index][2],
2097 ht.IntracellularConductivities(intra);
2099 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, extra,
2100 rExtraConductivities[region_index][0],
2101 rExtraConductivities[region_index][1],
2102 rExtraConductivities[region_index][2],
2105 ht.ExtracellularConductivities(extra);
2107 heterogeneities_container.push_back(ht);
2110 XSD_ANON_TYPE(cp::physiological_type, ConductivityHeterogeneities)
2111 heterogeneities_object;
2112 heterogeneities_object.ConductivityHeterogeneity(heterogeneities_container);
2114 mpParameters->Physiological().ConductivityHeterogeneities().set(heterogeneities_object);
2118 std::vector<c_vector<double, 3> >& rIntraConductivities,
2119 std::vector<c_vector<double, 3> >& rExtraConductivities)
2121 assert(rConductivityAreas.size() == rIntraConductivities.size());
2122 assert(rIntraConductivities.size() == rExtraConductivities.size());
2124 XSD_ANON_SEQUENCE_TYPE(cp::physiological_type, ConductivityHeterogeneities, ConductivityHeterogeneity)
2125 heterogeneities_container;
2127 for (
unsigned region_index = 0; region_index < rConductivityAreas.size(); region_index++)
2129 cp::point_type centre(rConductivityAreas[region_index].rGetCentre()[0],
2130 rConductivityAreas[region_index].rGetCentre()[1],
2131 rConductivityAreas[region_index].rGetCentre()[2]);
2133 cp::point_type radii(rConductivityAreas[region_index].rGetRadii()[0],
2134 rConductivityAreas[region_index].rGetRadii()[1],
2135 rConductivityAreas[region_index].rGetRadii()[2]);
2137 XSD_CREATE_WITH_FIXED_ATTR(cp::location_type, locn,
"cm");
2138 locn.Ellipsoid().set(cp::ellipsoid_type(centre, radii));
2139 cp::conductivity_heterogeneity_type ht(locn);
2141 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, intra,
2142 rIntraConductivities[region_index][0],
2143 rIntraConductivities[region_index][1],
2144 rIntraConductivities[region_index][2],
2147 ht.IntracellularConductivities(intra);
2149 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, extra,
2150 rExtraConductivities[region_index][0],
2151 rExtraConductivities[region_index][1],
2152 rExtraConductivities[region_index][2],
2155 ht.ExtracellularConductivities(extra);
2157 heterogeneities_container.push_back(ht);
2160 XSD_ANON_TYPE(cp::physiological_type, ConductivityHeterogeneities)
2161 heterogeneities_object;
2162 heterogeneities_object.ConductivityHeterogeneity(heterogeneities_container);
2164 mpParameters->Physiological().ConductivityHeterogeneities().set(heterogeneities_object);
2169 mpParameters->Simulation()->OutputDirectory().set(rOutputDirectory);
2174 mpParameters->Simulation()->OutputFilenamePrefix().set(rOutputFilenamePrefix);
2179 if (!
mpParameters->Simulation()->OutputVariables().present())
2181 cp::output_variables_type variables_requested;
2182 mpParameters->Simulation()->OutputVariables().set(variables_requested);
2185 XSD_SEQUENCE_TYPE(cp::output_variables_type::Var)& var_type_sequence =
mpParameters->Simulation()->OutputVariables()->Var();
2187 var_type_sequence.clear();
2189 for (
unsigned i = 0; i < rOutputVariables.size(); i++)
2191 cp::var_type temp(rOutputVariables[i]);
2192 var_type_sequence.push_back(temp);
2199 mpParameters->Simulation()->OutputUsingOriginalNodeOrdering().set(useOriginal ? cp::yesno_type::yes : cp::yesno_type::no);
2207 assert(checkpointTimestep != -1.0 && maxCheckpointsOnDisk != UINT_MAX);
2209 XSD_CREATE_WITH_FIXED_ATTR2(cp::simulation_type::XSD_NESTED_TYPE(CheckpointSimulation),
2212 maxCheckpointsOnDisk,
2214 mpParameters->Simulation()->CheckpointSimulation().set(cs);
2218 mpParameters->Simulation()->CheckpointSimulation().reset();
2228 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, intra,
2229 rIntraConductivities[0],
2230 rIntraConductivities[1],
2231 rIntraConductivities[2],
2234 mpParameters->Physiological().IntracellularConductivities().set(intra);
2239 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, intra,
2240 rIntraConductivities[0],
2241 rIntraConductivities[1],
2244 mpParameters->Physiological().IntracellularConductivities().set(intra);
2249 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, intra,
2250 rIntraConductivities[0],
2253 mpParameters->Physiological().IntracellularConductivities().set(intra);
2258 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, extra,
2259 rExtraConductivities[0],
2260 rExtraConductivities[1],
2261 rExtraConductivities[2],
2264 mpParameters->Physiological().ExtracellularConductivities().set(extra);
2269 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, extra,
2270 rExtraConductivities[0],
2271 rExtraConductivities[1],
2274 mpParameters->Physiological().ExtracellularConductivities().set(extra);
2279 XSD_CREATE_WITH_FIXED_ATTR3(cp::conductivities_type, extra,
2280 rExtraConductivities[0],
2283 mpParameters->Physiological().ExtracellularConductivities().set(extra);
2288 XSD_CREATE_WITH_FIXED_ATTR1(cp::conductivity_type, cond, bathConductivity,
"mS/cm");
2289 mpParameters->Physiological().BathConductivity().set(cond);
2306 if (tissueIds.empty() || bathIds.empty())
2308 EXCEPTION(
"Identifying set must be non-empty");
2310 std::set<unsigned> shared_identifiers;
2311 std::set_intersection(tissueIds.begin(),
2315 std::inserter(shared_identifiers, shared_identifiers.begin()));
2317 if (!shared_identifiers.empty())
2319 EXCEPTION(
"Tissue identifiers and bath identifiers overlap");
2327 XSD_CREATE_WITH_FIXED_ATTR1(cp::inverse_length_type, ratio_object, ratio,
"1/cm");
2328 mpParameters->Physiological().SurfaceAreaToVolumeRatio().set(ratio_object);
2333 XSD_CREATE_WITH_FIXED_ATTR1(cp::capacitance_type, capacitance_object, capacitance,
"uF/cm^2");
2334 mpParameters->Physiological().Capacitance().set(capacitance_object);
2340 XSD_CREATE_WITH_FIXED_ATTR3(cp::time_steps_type, time_steps,
2341 odeTimeStep, pdeTimeStep, printingTimeStep,
"ms");
2365 EXCEPTION(
"Ode time-step should be positive");
2369 EXCEPTION(
"Pde time-step should be positive");
2373 EXCEPTION(
"Printing time-step should be positive");
2378 EXCEPTION(
"Printing time-step should not be smaller than PDE time-step");
2383 EXCEPTION(
"Printing time-step should be a multiple of PDE time step");
2388 EXCEPTION(
"Ode time-step should not be greater than PDE time-step");
2395 EXCEPTION(
"Checkpoint time-step should be positive");
2400 EXCEPTION(
"Checkpoint time-step should be a multiple of printing time-step");
2407 ENSURE_SECTION_PRESENT(
mpParameters->Numerical().KSPTolerances(), cp::ksp_tolerances_type);
2409 mpParameters->Numerical().KSPTolerances()->KSPAbsolute().reset();
2410 mpParameters->Numerical().KSPTolerances()->KSPRelative().set(relativeTolerance);
2415 ENSURE_SECTION_PRESENT(
mpParameters->Numerical().KSPTolerances(), cp::ksp_tolerances_type);
2417 mpParameters->Numerical().KSPTolerances()->KSPRelative().reset();
2418 mpParameters->Numerical().KSPTolerances()->KSPAbsolute().set(absoluteTolerance);
2423 if (warnOfChange && strcmp(
GetKSPSolver(), kspSolver) != 0)
2426 WARNING(
"Code has changed the KSP solver type from " <<
GetKSPSolver() <<
" to " << kspSolver);
2430 if (strcmp(kspSolver,
"gmres") == 0)
2432 mpParameters->Numerical().KSPSolver().set(cp::ksp_solver_type::gmres);
2435 if (strcmp(kspSolver,
"cg") == 0)
2437 mpParameters->Numerical().KSPSolver().set(cp::ksp_solver_type::cg);
2440 if (strcmp(kspSolver,
"symmlq") == 0)
2442 mpParameters->Numerical().KSPSolver().set(cp::ksp_solver_type::symmlq);
2445 if (strcmp(kspSolver,
"chebychev") == 0)
2447 mpParameters->Numerical().KSPSolver().set(cp::ksp_solver_type::chebychev);
2451 EXCEPTION(
"Unknown solver type provided");
2457 if (strcmp(kspPreconditioner,
"jacobi") == 0)
2459 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::jacobi);
2462 if (strcmp(kspPreconditioner,
"bjacobi") == 0)
2464 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::bjacobi);
2467 if (strcmp(kspPreconditioner,
"hypre") == 0)
2469 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::hypre);
2472 if (strcmp(kspPreconditioner,
"ml") == 0)
2474 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::ml);
2477 if (strcmp(kspPreconditioner,
"spai") == 0)
2479 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::spai);
2482 if (strcmp(kspPreconditioner,
"twolevelsblockdiagonal") == 0)
2484 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::twolevelsblockdiagonal);
2487 if (strcmp(kspPreconditioner,
"blockdiagonal") == 0)
2489 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::blockdiagonal);
2492 if (strcmp(kspPreconditioner,
"ldufactorisation") == 0)
2494 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::ldufactorisation);
2497 if (strcmp(kspPreconditioner,
"none") == 0)
2499 mpParameters->Numerical().KSPPreconditioner().set(cp::ksp_preconditioner_type::none);
2503 EXCEPTION(
"Unknown preconditioner type provided");
2509 if (strcmp(meshPartioningMethod,
"dumb") == 0)
2511 mpParameters->Numerical().MeshPartitioning().set(cp::mesh_partitioning_type::dumb);
2514 if (strcmp(meshPartioningMethod,
"metis") == 0)
2516 WARNING(
"METIS library partitioning is deprecated")
2517 mpParameters->Numerical().MeshPartitioning().set(cp::mesh_partitioning_type::metis);
2520 if (strcmp(meshPartioningMethod,
"parmetis") == 0)
2522 mpParameters->Numerical().MeshPartitioning().set(cp::mesh_partitioning_type::parmetis);
2525 if (strcmp(meshPartioningMethod,
"petsc") == 0)
2527 mpParameters->Numerical().MeshPartitioning().set(cp::mesh_partitioning_type::petsc);
2531 EXCEPTION(
"Unknown mesh partitioning method provided");
2537 XSD_SEQUENCE_TYPE(cp::postprocessing_type::ActionPotentialDurationMap)& apd_maps_sequence
2538 =
mpParameters->PostProcessing()->ActionPotentialDurationMap();
2540 apd_maps_sequence.clear();
2542 for (
unsigned i = 0; i < apdMaps.size(); i++)
2544 XSD_CREATE_WITH_FIXED_ATTR2(cp::apd_map_type, temp,
2545 apdMaps[i].first, apdMaps[i].second,
2547 apd_maps_sequence.push_back(temp);
2554 XSD_SEQUENCE_TYPE(cp::postprocessing_type::UpstrokeTimeMap)& var_type_sequence
2558 var_type_sequence.clear();
2560 for (
unsigned i = 0; i < upstrokeTimeMaps.size(); i++)
2562 XSD_CREATE_WITH_FIXED_ATTR1(cp::upstrokes_map_type, temp,
2563 upstrokeTimeMaps[i],
2565 var_type_sequence.push_back(temp);
2572 XSD_SEQUENCE_TYPE(cp::postprocessing_type::MaxUpstrokeVelocityMap)& max_upstroke_velocity_maps_sequence
2573 =
mpParameters->PostProcessing()->MaxUpstrokeVelocityMap();
2576 max_upstroke_velocity_maps_sequence.clear();
2578 for (
unsigned i = 0; i < maxUpstrokeVelocityMaps.size(); i++)
2580 XSD_CREATE_WITH_FIXED_ATTR1(cp::max_upstrokes_velocity_map_type, temp,
2581 maxUpstrokeVelocityMaps[i],
2584 max_upstroke_velocity_maps_sequence.push_back(temp);
2591 XSD_SEQUENCE_TYPE(cp::postprocessing_type::ConductionVelocityMap)& conduction_velocity_maps_sequence
2592 =
mpParameters->PostProcessing()->ConductionVelocityMap();
2595 conduction_velocity_maps_sequence.clear();
2597 for (
unsigned i = 0; i < conductionVelocityMaps.size(); i++)
2599 cp::conduction_velocity_map_type temp(conductionVelocityMaps[i]);
2600 conduction_velocity_maps_sequence.push_back(temp);
2607 XSD_SEQUENCE_TYPE(cp::postprocessing_type::TimeTraceAtNode)& requested_nodes_sequence
2611 requested_nodes_sequence.clear();
2613 for (
unsigned i = 0; i < requestedNodes.size(); i++)
2615 cp::node_number_type temp(requestedNodes[i]);
2616 requested_nodes_sequence.push_back(temp);
2620template <
unsigned SPACE_DIM>
2624 XSD_SEQUENCE_TYPE(cp::postprocessing_type::PseudoEcgElectrodePosition)& electrodes_sequence
2625 =
mpParameters->PostProcessing()->PseudoEcgElectrodePosition();
2628 electrodes_sequence.clear();
2630 for (
unsigned i = 0; i < rPseudoEcgElectrodePositions.size(); i++)
2632 cp::point_type temp(rPseudoEcgElectrodePositions[i].GetWithDefault(0),
2633 rPseudoEcgElectrodePositions[i].GetWithDefault(1),
2634 rPseudoEcgElectrodePositions[i].GetWithDefault(2));
2635 electrodes_sequence.push_back(temp);
2645 ENSURE_SECTION_PRESENT(
mpParameters->Simulation()->OutputVisualizer(), cp::output_visualizer_type);
2652 mpParameters->Simulation()->OutputVisualizer()->meshalyzer(
2653 useMeshalyzer ? cp::yesno_type::yes : cp::yesno_type::no);
2661 useCmgui ? cp::yesno_type::yes : cp::yesno_type::no);
2669 useVtk ? cp::yesno_type::yes : cp::yesno_type::no);
2676 mpParameters->Simulation()->OutputVisualizer()->parallel_vtk(
2677 useParallelVtk ? cp::yesno_type::yes : cp::yesno_type::no);
2684 mpParameters->Simulation()->OutputVisualizer()->precision(numberOfDigits);
2688 unsigned index,
double magnitude,
2689 double startTime,
double duration)
2693 cp::axis_type axis = cp::axis_type::x;
2696 axis = cp::axis_type::y;
2698 else if (index == 2)
2700 axis = cp::axis_type::z;
2703 XSD_CREATE_WITH_FIXED_ATTR1(cp::surface_stimulus_strength_type, strength, magnitude,
"uA/cm^2");
2704 XSD_CREATE_WITH_FIXED_ATTR1(cp::time_type, start_time, startTime,
"ms");
2705 XSD_CREATE_WITH_FIXED_ATTR1(cp::time_type, duration_time, duration,
"ms");
2709 cp::electrodes_type element(groundSecondElectrode ? cp::yesno_type::yes : cp::yesno_type::no,
2718 mpParameters->Simulation()->Electrodes()->GroundSecondElectrode(groundSecondElectrode ? cp::yesno_type::yes : cp::yesno_type::no);
2719 mpParameters->Simulation()->Electrodes()->PerpendicularToAxis(axis);
2720 mpParameters->Simulation()->Electrodes()->Strength(strength);
2721 mpParameters->Simulation()->Electrodes()->StartTime(start_time);
2722 mpParameters->Simulation()->Electrodes()->Duration(duration_time);
2727 unsigned& rIndex,
double& rMagnitude,
2728 double& rStartTime,
double& rDuration)
2732 EXCEPTION(
"Attempted to get electrodes that have not been defined.");
2736 rGroundSecondElectrode = (
mpParameters->Simulation()->Electrodes()->GroundSecondElectrode() == cp::yesno_type::yes);
2738 cp::axis_type axis =
mpParameters->Simulation()->Electrodes()->PerpendicularToAxis();
2739 if (axis == cp::axis_type::x)
2743 else if (axis == cp::axis_type::y)
2752 rMagnitude =
mpParameters->Simulation()->Electrodes()->Strength();
2753 rStartTime =
mpParameters->Simulation()->Electrodes()->StartTime();
2754 rDuration =
mpParameters->Simulation()->Electrodes()->Duration();
2761 bool result =
false;
2762 if (
mpParameters->Numerical().UseStateVariableInterpolation().present())
2764 result =
mpParameters->Numerical().UseStateVariableInterpolation().get() == cp::yesno_type::yes;
2771 if (useStateVariableInterpolation)
2773 mpParameters->Numerical().UseStateVariableInterpolation().set(cp::yesno_type::yes);
2777 mpParameters->Numerical().UseStateVariableInterpolation().set(cp::yesno_type::no);
2783 return mpParameters->Physiological().ApplyDrug().present();
2788 CHECK_EXISTS(
HasDrugDose(),
"Physiological/ApplyDrug");
2789 return mpParameters->Physiological().ApplyDrug()->concentration();
2794 if (!
mpParameters->Physiological().ApplyDrug().present())
2796 cp::apply_drug_type drug(drugDose);
2801 mpParameters->Physiological().ApplyDrug()->concentration(drugDose);
2807 CHECK_EXISTS(
HasDrugDose(),
"Physiological/ApplyDrug");
2808 std::map<std::string, std::pair<double, double> > ic50s;
2810 XSD_SEQUENCE_TYPE(cp::apply_drug_type::IC50)& ic50_seq =
mpParameters->Physiological().ApplyDrug()->IC50();
2812 for (XSD_ITERATOR_TYPE(cp::apply_drug_type::IC50) i = ic50_seq.begin();
2813 i != ic50_seq.end();
2816 std::pair<double, double> ic50_hill(*i, i->hill());
2817 std::string current = i->current();
2818 ic50s[current] = ic50_hill;
2826 if (!
mpParameters->Physiological().ApplyDrug().present())
2830 XSD_SEQUENCE_TYPE(cp::apply_drug_type::IC50)& ic50_seq =
mpParameters->Physiological().ApplyDrug()->IC50();
2831 if (ic50_seq.empty())
2836 bool entry_exists =
false;
2837 cp::ic50_type ic50_elt(ic50, rCurrentName);
2838 ic50_elt.hill(hill);
2839 for (XSD_ITERATOR_TYPE(cp::apply_drug_type::IC50) i = ic50_seq.begin();
2840 i != ic50_seq.end();
2843 if (i->current() == rCurrentName)
2845 entry_exists =
true;
2852 ic50_seq.push_back(ic50_elt);
2909 return mpParameters->Simulation()->Purkinje().present();
2914 CHECK_EXISTS(
mpParameters->Physiological().Purkinje().present(),
"Physiological/Purkinje");
2915 CHECK_EXISTS(
mpParameters->Physiological().Purkinje()->Capacitance().present(),
2916 "Physiological/Purkinje/Capacitance");
2917 return mpParameters->Physiological().Purkinje()->Capacitance().get();
2922 ENSURE_SECTION_PRESENT(
mpParameters->Physiological().Purkinje(), cp::purkinje_physiological_type);
2923 XSD_CREATE_WITH_FIXED_ATTR1(cp::capacitance_type, purk_Cm, capacitance,
"uF/cm^2");
2924 mpParameters->Physiological().Purkinje()->Capacitance().set(purk_Cm);
2929 CHECK_EXISTS(
mpParameters->Physiological().Purkinje().present(),
"Physiological/Purkinje");
2930 CHECK_EXISTS(
mpParameters->Physiological().Purkinje()->SurfaceAreaToVolumeRatio().present(),
2931 "Physiological/Purkinje/SurfaceAreaToVolumeRatio");
2932 return mpParameters->Physiological().Purkinje()->SurfaceAreaToVolumeRatio().get();
2937 ENSURE_SECTION_PRESENT(
mpParameters->Physiological().Purkinje(), cp::purkinje_physiological_type);
2938 XSD_CREATE_WITH_FIXED_ATTR1(cp::inverse_length_type, purk_Am, ratio,
"1/cm");
2939 mpParameters->Physiological().Purkinje()->SurfaceAreaToVolumeRatio().set(purk_Am);
2944 CHECK_EXISTS(
mpParameters->Physiological().Purkinje().present(),
"Physiological/Purkinje");
2945 CHECK_EXISTS(
mpParameters->Physiological().Purkinje()->Conductivity().present(),
2946 "Physiological/Purkinje/Conductivity");
2947 return mpParameters->Physiological().Purkinje()->Conductivity().get();
2952 ENSURE_SECTION_PRESENT(
mpParameters->Physiological().Purkinje(), cp::purkinje_physiological_type);
2953 XSD_CREATE_WITH_FIXED_ATTR1(cp::conductivity_type, purkinje_conductivity, conductivity,
"mS/cm");
2954 mpParameters->Physiological().Purkinje()->Conductivity().set(purkinje_conductivity);
2966 xercesc::DOMElement* pRootElement)
2968 using namespace xercesc;
2971 "ResumeSimulation/ArchiveDirectory");
2972 if (elts.size() > 0)
2975 DOMElement* p_dir_elt = elts[0];
2976 p_dir_elt->setAttribute(X(
"relative_to"), X(
"chaste_test_output"));
2981 xercesc::DOMElement* pRootElement)
2986 "Simulation/IonicModels/Default");
2987 if (p_elt_list.size() > 0)
2989 assert(p_elt_list.size() == 1);
2993 for (
unsigned i = 0; i < p_elt_list.size(); i++)
3001 xercesc::DOMElement* pRootElement)
3005 "Numerical/KSPPreconditioner");
3006 if (p_elt_list.size() > 0)
3008 assert(p_elt_list.size() == 1);
3009 std::string text_value = X2C(p_elt_list[0]->getTextContent());
3010 if (text_value ==
"ilu")
3012 EXCEPTION(
"PETSc does not have a parallel implementation of ilu, so we no longer allow it as an option. Use bjacobi instead.");
3018 xercesc::DOMElement* pRootElement)
3022 "Simulation/ConductivityHeterogeneities");
3023 if (p_elt_list.size() > 0)
3025 assert(p_elt_list.size() == 1);
3026 xercesc::DOMNode* p_parent = p_elt_list[0]->getParentNode();
3027 xercesc::DOMNode* p_child = p_parent->removeChild(p_elt_list[0]);
3029 assert(p_phys_list.size() == 1);
3030 p_phys_list[0]->appendChild(p_child);
3035 xercesc::DOMElement* pRootElement)
3038 if (p_sim_list.size() > 0)
3040 std::vector<xercesc::DOMElement*> p_viz_list =
XmlTools::FindElements(p_sim_list[0],
"OutputVisualizer");
3041 if (p_viz_list.empty())
3044 xercesc::DOMElement* p_viz_elt = pDocument->createElementNS(X(
"https://chaste.comlab.ox.ac.uk/nss/parameters/3_3"), X(
"OutputVisualizer"));
3045 p_sim_list[0]->appendChild(p_viz_elt);
3046 p_viz_elt->setAttribute(X(
"meshalyzer"), X(
"yes"));
3059template void HeartConfig::GetIonicModelRegions<3u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<3u> > >&, std::vector<cp::ionic_model_selection_type>&)
const;
3060template void HeartConfig::GetStimuli<3u>(std::vector<boost::shared_ptr<AbstractStimulusFunction> >&, std::vector<boost::shared_ptr<
AbstractChasteRegion<3u> > >&)
const;
3061template void HeartConfig::GetCellHeterogeneities<3u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<3u> > >&, std::vector<double>&, std::vector<double>&, std::vector<double>&, std::vector<std::map<std::string, double> >*);
3062template void HeartConfig::GetConductivityHeterogeneities<3u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<3u> > >&, std::vector<c_vector<double, 3> >&, std::vector<c_vector<double, 3> >&)
const;
3064template void HeartConfig::GetIonicModelRegions<2u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<2u> > >&, std::vector<cp::ionic_model_selection_type>&)
const;
3065template void HeartConfig::GetStimuli<2u>(std::vector<boost::shared_ptr<AbstractStimulusFunction> >&, std::vector<boost::shared_ptr<
AbstractChasteRegion<2u> > >&)
const;
3066template void HeartConfig::GetCellHeterogeneities<2u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<2u> > >&, std::vector<double>&, std::vector<double>&, std::vector<double>&, std::vector<std::map<std::string, double> >*);
3067template void HeartConfig::GetConductivityHeterogeneities<2u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<2u> > >&, std::vector<c_vector<double, 3> >&, std::vector<c_vector<double, 3> >&)
const;
3069template void HeartConfig::GetIonicModelRegions<1u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<1u> > >&, std::vector<cp::ionic_model_selection_type>&)
const;
3070template void HeartConfig::GetStimuli<1u>(std::vector<boost::shared_ptr<AbstractStimulusFunction> >&, std::vector<boost::shared_ptr<
AbstractChasteRegion<1u> > >&)
const;
3071template void HeartConfig::GetCellHeterogeneities<1u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<1u> > >&, std::vector<double>&, std::vector<double>&, std::vector<double>&, std::vector<std::map<std::string, double> >*);
3072template void HeartConfig::GetConductivityHeterogeneities<1u>(std::vector<boost::shared_ptr<
AbstractChasteRegion<1u> > >&, std::vector<c_vector<double, 3> >&, std::vector<c_vector<double, 3> >&)
const;
#define EXCEPTION(message)
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()
#define CHASTE_CLASS_EXPORT(T)
static std::string GetArchiveDirectory()
static const char * GetRootDir()
virtual void SetPath(const std::string &rPath, RelativeTo::Value relativeTo)
FileFinder CopyTo(const FileFinder &rDest) const
SchemaLocationsMap mSchemaLocations
void SetRequestedNodalTimeTraces(std::vector< unsigned > &requestedNodes)
void GetStimuli(std::vector< boost::shared_ptr< AbstractStimulusFunction > > &rStimuliApplied, std::vector< boost::shared_ptr< AbstractChasteRegion< DIM > > > &rStimulatedAreas) const
DistributedTetrahedralMeshPartitionType::type GetMeshPartitioning() const
bool AreCellularTransmuralHeterogeneitiesRequested()
unsigned GetMaxCheckpointsOnDisk() const
std::map< std::string, std::string > SchemaLocationsMap
bool IsSimulationDefined() const
void SetUseMassLumpingForPrecond(bool useMassLumping=true)
void SetIntracellularConductivities(const c_vector< double, 3 > &rIntraConductivities)
void GetSheetDimensions(c_vector< double, 2 > &sheetDimensions) const
void SetTissueAndBathIdentifiers(const std::set< unsigned > &rTissueIds, const std::set< unsigned > &rBathIds)
std::string GetMeshName() const
cp::media_type GetConductivityMedia() const
double GetCapacitance() const
std::set< unsigned > mBathIdentifiers
void SetMaxUpstrokeVelocityMaps(std::vector< double > &rMaxUpstrokeVelocityMaps)
void SetConductivityHeterogeneitiesEllipsoid(std::vector< ChasteEllipsoid< 3 > > &rConductivityAreas, std::vector< c_vector< double, 3 > > &rIntraConductivities, std::vector< c_vector< double, 3 > > &rExtraConductivities)
double GetAbsoluteTolerance() const
void SetUseFixedNumberIterationsLinearSolver(bool useFixedNumberIterations=true, unsigned evaluateNumItsEveryNSolves=UINT_MAX)
void SetBathMultipleConductivities(std::map< unsigned, double > bathConductivities)
double GetPurkinjeSurfaceAreaToVolumeRatio()
HeartFileFinder GetArchivedSimulationDir() const
static boost::shared_ptr< HeartConfig > mpInstance
double GetPdeTimeStep() const
bool mUseFixedNumberIterations
double GetDrugDose() const
bool GetCreateFibre() const
double GetPrintingTimeStep() const
void SetDefaultIonicModel(const cp::ionic_models_available_type &rIonicModel)
void CheckResumeSimulationIsDefined(std::string callingMethod="") const
bool GetUseFixedNumberIterationsLinearSolver()
void CopySchema(const std::string &rToDirectory)
void SetElectrodeParameters(bool groundSecondElectrode, unsigned index, double magnitude, double startTime, double duration)
void GetOutputVariables(std::vector< std::string > &rOutputVariables) const
void SetSheetDimensions(double x, double y, double inter_node_space)
bool mUseFixedSchemaLocation
void SetPrintingTimeStep(double printingTimeStep)
boost::shared_ptr< cp::chaste_parameters_type > mpParameters
double GetMidLayerFraction()
void SetFibreLength(double x, double inter_node_space)
unsigned GetVisualizerOutputPrecision()
void SetPurkinjeCapacitance(double capacitance)
bool IsOutputVisualizerPresent() const
void SetUpstrokeTimeMaps(std::vector< double > &rUpstrokeTimeMaps)
void SetApdMaps(const std::vector< std::pair< double, double > > &rApdMaps)
double GetSurfaceAreaToVolumeRatio() const
double GetSimulationDuration() const
void SetDrugDose(double drugDose)
double GetOdeTimeStep() const
FileFinder mParametersFilePath
bool IsPostProcessingSectionPresent() const
bool IsMaxUpstrokeVelocityMapRequested() const
void SetKSPSolver(const char *kspSolver, bool warnOfChange=false)
bool IsPostProcessingRequested() const
void SetUseFixedSchemaLocation(bool useFixedSchemaLocation)
void SetOutputUsingOriginalNodeOrdering(bool useOriginal)
bool GetVisualizeWithParallelVtk() const
unsigned GetSpaceDimension() const
bool GetCreateMesh() const
void SetIc50Value(const std::string &rCurrentName, double ic50, double hill=1.0)
bool IsAnyNodalTimeTraceRequested() const
void SetOutputDirectory(const std::string &rOutputDirectory)
std::map< unsigned, double > mBathConductivities
FileFinder GetParametersFilePath()
void EnsurePostProcessingSectionPresent()
void SetUseReactionDiffusionOperatorSplitting(bool useOperatorSplitting=true)
void CheckTimeSteps() const
void GetConductivityHeterogeneities(std::vector< boost::shared_ptr< AbstractChasteRegion< DIM > > > &conductivitiesHeterogeneityAreas, std::vector< c_vector< double, 3 > > &intraConductivities, std::vector< c_vector< double, 3 > > &extraConductivities) const
void SetDomain(const cp::domain_type &rDomain)
const char * GetKSPPreconditioner() const
bool GetUseAbsoluteTolerance() const
bool IsSimulationResumed() const
void SetFixedSchemaLocations(const SchemaLocationsMap &rSchemaLocations)
bool mUserAskedForCellularTransmuralHeterogeneities
bool GetVisualizeWithCmgui() const
void EnsureOutputVisualizerExists(void)
void SetUseStateVariableInterpolation(bool useStateVariableInterpolation=true)
bool GetOutputUsingOriginalNodeOrdering()
bool IsElectrodesPresent() const
void SetMeshPartitioning(const char *meshPartioningMethod)
bool IsApdMapsRequested() const
bool IsConductionVelocityMapsRequested() const
double GetRelativeTolerance() const
void GetNodalTimeTraceRequested(std::vector< unsigned > &rRequestedNodes) const
unsigned GetMidLayerIndex()
void SetUseRelativeTolerance(double relativeTolerance)
const std::set< unsigned > & rGetBathIdentifiers()
void SetVisualizeWithMeshalyzer(bool useMeshalyzer=true)
void SetPdeTimeStep(double pdeTimeStep)
cp::ionic_model_selection_type GetDefaultIonicModel() const
void SetSlabDimensions(double x, double y, double z, double inter_node_space)
void SetSpaceDimension(unsigned spaceDimension)
unsigned GetEvaluateNumItsEveryNSolves()
boost::shared_ptr< cp::chaste_parameters_type > ReadFile(const std::string &rFileName)
unsigned mEvaluateNumItsEveryNSolves
void GetApdMaps(std::vector< std::pair< double, double > > &rApdMaps) const
void SetSurfaceAreaToVolumeRatio(double ratio)
void GetIonicModelRegions(std::vector< boost::shared_ptr< AbstractChasteRegion< DIM > > > &rDefinedRegions, std::vector< cp::ionic_model_selection_type > &rIonicModels) const
void SetUseAbsoluteTolerance(double absoluteTolerance)
bool GetUseRelativeTolerance() const
void SetPurkinjeSurfaceAreaToVolumeRatio(double ratio)
void SetKSPPreconditioner(const char *kspPreconditioner)
void GetConductionVelocityMaps(std::vector< unsigned > &rConductionVelocityMaps) const
void SetDefaultSchemaLocations()
void SetOdeTimeStep(double odeTimeStep)
bool GetCreateSlab() const
double GetPurkinjeCapacitance()
unsigned GetEpiLayerIndex()
void SetBathConductivity(double bathConductivity)
double GetPurkinjeConductivity()
void SetIonicModelRegions(std::vector< ChasteCuboid< 3 > > &rDefinedRegions, std::vector< cp::ionic_model_selection_type > &rIonicModels) const
bool GetUseReactionDiffusionOperatorSplitting()
void SetVisualizeWithVtk(bool useVtk=true)
void SetExtracellularConductivities(const c_vector< double, 3 > &rExtraConductivities)
std::string GetOutputFilenamePrefix() const
bool GetVisualizeWithMeshalyzer() const
void SetSimulationDuration(double simulationDuration)
void SetCapacitance(double capacitance)
void SetConductionVelocityMaps(std::vector< unsigned > &rConductionVelocityMaps)
double GetEndoLayerFraction()
void SetConductivityHeterogeneities(std::vector< ChasteCuboid< 3 > > &rConductivityAreas, std::vector< c_vector< double, 3 > > &rIntraConductivities, std::vector< c_vector< double, 3 > > &rExtraConductivities)
bool GetConductivityHeterogeneitiesProvided() const
void SetOutputVariables(const std::vector< std::string > &rOutputVariables)
void GetSlabDimensions(c_vector< double, 3 > &slabDimensions) const
void GetPseudoEcgElectrodePositions(std::vector< ChastePoint< SPACE_DIM > > &rPseudoEcgElectrodePositions) const
void GetElectrodeParameters(bool &rGroundSecondElectrode, unsigned &rIndex, double &rMagnitude, double &rStartTime, double &rDuration)
void LoadFromCheckpoint()
void Write(bool useArchiveLocationInfo=false, std::string subfolderName="output")
std::map< std::string, std::pair< double, double > > GetIc50Values()
std::set< unsigned > mTissueIdentifiers
double GetEpiLayerFraction()
unsigned GetEndoLayerIndex()
bool mUseMassLumpingForPrecond
double GetCheckpointTimestep() const
bool IsMeshProvided() const
bool GetVisualizeWithVtk() const
void SetOutputFilenamePrefix(const std::string &rOutputFilenamePrefix)
void SetCheckpointSimulation(bool checkpointSimulation, double checkpointTimestep=-1.0, unsigned maxCheckpointsOnDisk=UINT_MAX)
void SetPurkinjeConductivity(double conductivity)
void GetIntracellularConductivities(c_vector< double, 3 > &rIntraConductivities) const
bool GetUseMassLumpingForPrecond()
void SetMeshFileName(std::string meshPrefix, cp::media_type fibreDefinition=cp::media_type::NoFibreOrientation)
void GetCellHeterogeneities(std::vector< boost::shared_ptr< AbstractChasteRegion< DIM > > > &rCellHeterogeneityRegions, std::vector< double > &rScaleFactorGks, std::vector< double > &rScaleFactorIto, std::vector< double > &rScaleFactorGkr, std::vector< std::map< std::string, double > > *pParameterSettings)
void GetUpstrokeTimeMaps(std::vector< double > &rUpstrokeTimeMaps) const
bool GetUseStateVariableInterpolation() const
const std::set< unsigned > & rGetTissueIdentifiers()
unsigned GetVersionFromNamespace(const std::string &rNamespaceUri)
bool mUseReactionDiffusionOperatorSplitting
void GetMaxUpstrokeVelocityMaps(std::vector< double > &rUpstrokeVelocityMaps) const
double GetInterNodeSpace() const
cp::domain_type GetDomain() const
bool GetOutputVariablesProvided() const
std::string GetOutputDirectory() const
double GetBathConductivity(unsigned bathRegion=UINT_MAX) const
void SetUseMassLumping(bool useMassLumping=true)
bool IsPseudoEcgCalculationRequested() const
void CheckSimulationIsDefined(std::string callingMethod="") const
bool IsUpstrokeTimeMapsRequested() const
void SetVisualizeWithCmgui(bool useCmgui=true)
void GetExtracellularConductivities(c_vector< double, 3 > &rExtraConductivities) const
bool GetCheckpointSimulation() const
void SetVisualizeWithParallelVtk(bool useParallelVtk=true)
void UpdateParametersFromResumeSimulation(boost::shared_ptr< cp::chaste_parameters_type > pResumeParameters)
void SetParametersFile(const std::string &rFileName)
void GetFibreLength(c_vector< double, 1 > &fibreLength) const
static HeartConfig * Instance()
const char * GetKSPSolver() const
void SetVisualizerOutputPrecision(unsigned numberOfDigits)
void SetOdePdeAndPrintingTimeSteps(double odeTimeStep, double pdeTimeStep, double printingTimeStep)
void SetPseudoEcgElectrodePositions(const std::vector< ChastePoint< SPACE_DIM > > &rPseudoEcgElectrodePositions)
bool IsAdaptivityParametersPresent() const
bool GetCreateSheet() const
static bool IsRegionBath(HeartRegionType regionId)
std::string GetOutputDirectoryFullPath() const