diff --git a/src/build_models/meinhardtplugin.cpp b/src/build_models/meinhardtplugin.cpp new file mode 100644 --- /dev/null +++ b/src/build_models/meinhardtplugin.cpp @@ -0,0 +1,134 @@ +/* + * + * This file is part of the Virtual Leaf. + * + * The Virtual Leaf is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Virtual Leaf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Virtual Leaf. If not, see . + * + * Copyright 2010 Roeland Merks. + * + */ + +#include +#include +#include "simplugin.h" + +#include "parameter.h" +#include "warning.h" +#include "wallbase.h" +#include "cellbase.h" +#include "meinhardtplugin.h" + +static const std::string _module_id("$Id$"); + +bool batch = false; + +// To be executed after cell division +void MeinhardtPlugin::OnDivide(ParentInfo &parent_info, CellBase &daughter1, CellBase &daughter2) { + +} + +void MeinhardtPlugin::SetCellColor(CellBase &c, QColor &color) { + + if (fpclassify(c.Chemical(0))==FP_NAN) { + // somehow the function isnan doesn't work properly on my system... SuSE Linux + // 10.0 64-bits (isnan seems not be implemented using fpclassify). + MyWarning::warning("Whoops! Numerical instability!!"); + color.setNamedColor("red"); + } else { + double range_min = 0.;//, range_max = 1.; + if (c.Chemical(0) par->rel_cell_div_threshold * c.BaseArea() ) { + c.Divide(); + } + + // cell expansion is inhibited by substrate (chem 3) + if (!par->constituous_expansion_limit || c.NCells()constituous_expansion_limit) { + c.EnlargeTargetArea(par->cell_expansion_rate ); + } else { + if (c.Chemical(0)<0.5) { + double tmp; + c.EnlargeTargetArea((tmp=(1.-par->vessel_inh_level*c.Chemical(3))*par->cell_expansion_rate /* + c.Chemical(4)*/)<0?0:tmp); + } else { + c.EnlargeTargetArea(par->vessel_expansion_rate); + } + } + +} + +void MeinhardtPlugin::CelltoCellTransport(Wall *w, double *dchem_c1, double *dchem_c2) { + + // No flux boundaries for all chemicals, except activator: boundary is sink + if (w->C1()->BoundaryPolP() || w->C2()->BoundaryPolP()) { + + if (w->C1()->BoundaryPolP()) { + dchem_c2[1] -= w->Length() * ( par->D[1] ) * ( w->C2()->Chemical(1) ); + } else { + dchem_c1[1] -= w->Length() * ( par->D[1] ) * ( w->C1()->Chemical(1) ); + } + return; + } + + + // Passive fluxes (Fick's law) + for (int c=0;cLength() * ( par->D[c] ) * ( w->C2()->Chemical(c) - w->C1()->Chemical(c) ); + dchem_c1[c] += phi; + dchem_c2[c] -= phi; + } + + +} + +void MeinhardtPlugin::WallDynamics(Wall *w, double *dw1, double *dw2) { + for (int c = 0;cChemical(0); + double A = c->Chemical(1); + double H = c->Chemical(2); + double S = c->Chemical(3); + //double expansin = c->Chemical(4); + + + dchem[0] = ( par->d * A - par->e * Y + Y*Y/(1 + par->f * Y*Y ) ); + dchem[1] = ( par->c * A*A*S/H - par->mu * A + par->rho0*Y ); + dchem[2] = ( par->c * A*A*S - par->nu*H + par->rho1*Y ); + dchem[3] = ( par->c0 - par->gamma*S - par->eps * Y * S ); + //dchem[4] = ( -par->expansindecay * expansin ); + //for (int i=0;i<4;i++) { cerr << "[ " << dchem[i] << " ]"; } cerr << endl; + +// cerr << "Chemicals: "; for (int i=0;iChemical(i) << " "; } cerr << endl; + +// test: dchem[0] = 0.01 * c->Chemical(0) * ( 1. - c->Chemical(0)); +} + + +Q_EXPORT_PLUGIN2(meinhardtplugin, MeinhardtPlugin)