Diffusion.h
1 /**************************************************************************************
2 Copyright 2015 Applied Research Associates, Inc.
3 Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4 this file except in compliance with the License. You may obtain a copy of the License
5 at:
6 http://www.apache.org/licenses/LICENSE-2.0
7 Unless required by applicable law or agreed to in writing, software distributed under
8 the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
9 CONDITIONS OF ANY KIND, either express or implied. See the License for the
10 specific language governing permissions and limitations under the License.
11 **************************************************************************************/
12 
13 #pragma once
14 #include <memory>
15 
16 #include <Eigen/Core>
17 
18 #include <biogears/cdm/CommonDataModel.h>
19 #include <biogears/exports.h>
20 #include <vector>
21 #include <memory>
22 #include <Eigen/Core>
23 
24 
25 namespace biogears {
26 class MassUnit;
27 class BioGears;
28 class SESubstanceManager;
29 class SESubstance;
30 class SETissueCompartment;
31 class SELiquidCompartment;
32 
33 class BIOGEARS_API DiffusionCalculator : public Loggable {
34  friend class BioGears;
35  friend class BioGearsEngineTest;
36 
37 protected:
38  static auto make_unique(BioGears& bg) -> std::unique_ptr<DiffusionCalculator>;
40 
41  void ClearConcentrations();
43 
49  };
50 
52  Eigen::MatrixXd vascular;
53  Eigen::MatrixXd extracellular;
54  Eigen::MatrixXd intracellular;
55  };
56 
58  std::vector<double> vascular_ug_Per_mL;
59  std::vector<double> extracellular_ug_Per_mL;
60  std::vector<double> intracellular_ug_Per_mL;
61  };
62 
63 public:
64  ~DiffusionCalculator() = default;
65  void Initialize(SESubstanceManager& subMgr);
66  void SetDiffusionState();
67  void CalculateLinearDiffusionMethods();
68  void CalculateNonLinearDiffusionMethods();
69 
70  std::vector<DiffusionCompartmentSet>& GetDiffusionSets() { return m_DiffusionSets; };
71  std::vector<SESubstance*>& GetFacilitatedDiffusionSubstances() { return m_FacilitatedDiffusionSubstances; };
72  std::vector<SESubstance*>& GetInstantDiffusionSubstances() { return m_InstantDiffusionSubstances; };
73  std::vector<SESubstance*>& GetSimpleDiffusionSubstances() { return m_SimpleDiffusionSubstances; };
74 
75 protected:
76  void CalculateActiveIonDiffusion(DiffusionCompartmentSet& cmptSet);
77  void CalculateMacromoleculeDiffusion(DiffusionCompartmentSet& cmptSet, const SESubstance& sub);
78  void CalculatePassiveLymphDiffusion(SELiquidCompartment& source, SELiquidCompartment& target, const SESubstance& sub);
79  void CalculateFacilitatedDiffusion(DiffusionCompartmentSet& cmptSet, const SESubstance& sub, double combinedCoefficient_g_Per_s);
80  void CalculatePerfusionLimitedDiffusion(DiffusionCompartmentSet& cmptSet, const SESubstance& sub, double partitionCoeff);
81 
82 private:
83  void DistributeMassbyVolumeWeighted(SELiquidCompartment& cmpt, const SESubstance& sub, double mass, const MassUnit& unit);
84  void DistributeMassbyMassWeighted(SELiquidCompartment& cmpt, const SESubstance& sub, double mass, const MassUnit& unit);
85  double SodiumPotassiumPump(double intraNa_mM, double extraNa_mM, double extraK_mM, double potential_V);
86  double CalciumPump(double intraCa_M);
87 
88  double m_dt_s;
89 
90  std::vector<SESubstance*> m_SimpleDiffusionSubstances;
91  std::vector<SESubstance*> m_InstantDiffusionSubstances;
92  std::vector<SESubstance*> m_FacilitatedDiffusionSubstances;
93 
98 
99  std::vector<DiffusionCompartmentSet> m_DiffusionSets;
100 
101  Eigen::VectorXd m_PermeabilityCoefficients;
102  Eigen::VectorXd m_TissueMasses_g;
104  Eigen::VectorXd m_VolumeRatiosExtraIntra;
105 };
106 }
double m_dt_s
Definition: Diffusion.h:88
std::vector< SESubstance * > & GetSimpleDiffusionSubstances()
Definition: Diffusion.h:73
Eigen::VectorXd m_VolumeRatiosVascularExtra
Definition: Diffusion.h:103
std::vector< SESubstance * > m_SimpleDiffusionSubstances
Definition: Diffusion.h:90
Eigen::MatrixXd intracellular
Definition: Diffusion.h:54
std::vector< SESubstance * > m_FacilitatedDiffusionSubstances
Definition: Diffusion.h:92
BioGears & m_data
Definition: Diffusion.h:42
std::vector< double > intracellular_ug_Per_mL
Definition: Diffusion.h:60
Definition: Logger.h:27
std::vector< SESubstance * > & GetInstantDiffusionSubstances()
Definition: Diffusion.h:72
Definition: Diffusion.h:33
Eigen::MatrixXd vascular
Definition: Diffusion.h:52
Eigen::MatrixXd extracellular
Definition: Diffusion.h:53
DiffusionMatrixSet m_SimpleSubMatrices
Definition: Diffusion.h:97
Definition: SELiquidCompartment.h:27
SELiquidCompartment * vascular
Definition: Diffusion.h:46
ConcentrationSet m_InstantSubConcentrations
Definition: Diffusion.h:94
std::vector< SESubstance * > m_InstantDiffusionSubstances
Definition: Diffusion.h:91
Definition: BioGearsEngineTest.h:24
std::vector< double > vascular_ug_Per_mL
Definition: Diffusion.h:58
SETissueCompartment * tissue
Definition: Diffusion.h:45
std::vector< SESubstance * > & GetFacilitatedDiffusionSubstances()
Definition: Diffusion.h:71
SELiquidCompartment * extracellular
Definition: Diffusion.h:47
Definition: SESubstance.h:49
Eigen::VectorXd m_PermeabilityCoefficients
Definition: Diffusion.h:101
std::vector< double > extracellular_ug_Per_mL
Definition: Diffusion.h:59
Manages and controls execution of all data/systems in BioGears.
Definition: BioGears.h:86
ConcentrationSet m_SimpleSubConcentrations
Definition: Diffusion.h:95
std::vector< DiffusionCompartmentSet > & GetDiffusionSets()
Definition: Diffusion.h:70
Definition: SESubstanceManager.h:23
Definition: SEScalarMass.h:18
Definition: SEElectricalCircuit.h:18
DiffusionMatrixSet m_InstantSubMatrices
Definition: Diffusion.h:96
Definition: SETissueCompartment.h:32
Eigen::VectorXd m_TissueMasses_g
Definition: Diffusion.h:102
std::vector< DiffusionCompartmentSet > m_DiffusionSets
Definition: Diffusion.h:99
Eigen::VectorXd m_VolumeRatiosExtraIntra
Definition: Diffusion.h:104
SELiquidCompartment * intracellular
Definition: Diffusion.h:48