use of cbit.vcell.math.PdeEquation.BoundaryConditionValue in project vcell by virtualcell.
the class XmlReader method getBoundaryConditionValue.
private BoundaryConditionValue getBoundaryConditionValue(Element param, PdeEquation pde) throws XmlParseException, MathException {
// retrieve values
String name = unMangle(param.getAttributeValue(XMLTags.NameAttrTag));
Expression valueExpr = unMangleExpression(param.getAttributeValue(XMLTags.BoundaryValueExpressionTag));
if (name != null && valueExpr != null) {
BoundaryConditionValue bcv = pde.new BoundaryConditionValue(name, valueExpr);
return bcv;
}
return null;
}
use of cbit.vcell.math.PdeEquation.BoundaryConditionValue in project vcell by virtualcell.
the class MathDescription method gatherIssues.
/**
* This method was created in VisualAge.
* @return boolean
*/
public void gatherIssues(IssueContext issueContext, List<Issue> issueList) {
issueContext = issueContext.newChildContext(ContextType.MathDescription, this);
setWarning(null);
if (geometry == null) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_NoGeometry, VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_1, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (isSpatialStoch() && geometry.getDimension() != 3) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.Smoldyn_Geometry_3DWarning, "VCell spatial stochastic models only support 3D geometry.", Issue.SEVERITY_ERROR);
issueList.add(issue);
}
// check Constant are really constants
for (int i = 0; i < variableList.size(); i++) {
Variable var = variableList.get(i);
if (var instanceof Constant) {
try {
((Constant) var).getExpression().evaluateConstant();
} catch (Exception ex) {
ex.printStackTrace(System.out);
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_Constant_NotANumber, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_CONSTANT, var.getExpression().infix()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
//
// count number of variables of each type
//
int volVarCount = 0;
int memVarCount = 0;
int filVarCount = 0;
int volRegionVarCount = 0;
int memRegionVarCount = 0;
int filRegionVarCount = 0;
int stochVarCount = 0;
int pointVarCount = 0;
for (int i = 0; i < variableList.size(); i++) {
Variable var = variableList.get(i);
if (var instanceof VolVariable) {
volVarCount++;
} else if (var instanceof MemVariable) {
memVarCount++;
} else if (var instanceof FilamentVariable) {
filVarCount++;
} else if (var instanceof VolumeRegionVariable) {
volRegionVarCount++;
} else if (var instanceof MembraneRegionVariable) {
memRegionVarCount++;
} else if (var instanceof FilamentRegionVariable) {
filRegionVarCount++;
} else if (var instanceof StochVolVariable) {
stochVarCount++;
} else if (var instanceof PointVariable) {
pointVarCount++;
}
}
//
for (int i = 0; i < subDomainList.size(); i++) {
try {
SubDomain subDomain = subDomainList.get(i);
Enumeration<Equation> equEnum = subDomain.getEquations();
while (equEnum.hasMoreElements()) {
Equation equ = equEnum.nextElement();
equ.checkValid(this, subDomain);
equ.bind(this);
}
FastSystem fastSystem = subDomain.getFastSystem();
if (fastSystem != null) {
Enumeration<FastRate> frEnum = fastSystem.getFastRates();
while (frEnum.hasMoreElements()) {
FastRate fr = frEnum.nextElement();
fr.bind(this);
}
Enumeration<FastInvariant> fiEnum = fastSystem.getFastInvariants();
while (fiEnum.hasMoreElements()) {
FastInvariant fi = fiEnum.nextElement();
fi.bind(this);
}
}
for (ParticleProperties pp : subDomain.getParticleProperties()) {
pp.bind(this);
}
for (ParticleJumpProcess pjp : subDomain.getParticleJumpProcesses()) {
pjp.bind(this);
Expression rateDefinition = null;
JumpProcessRateDefinition jprd = pjp.getParticleRateDefinition();
if (jprd instanceof MacroscopicRateConstant) {
rateDefinition = MathUtilities.substituteFunctions(((MacroscopicRateConstant) jprd).getExpression(), this);
} else if (jprd instanceof InteractionRadius) {
rateDefinition = MathUtilities.substituteFunctions(((InteractionRadius) jprd).getExpression(), this);
} else {
new RuntimeException("The jump process rate definition is not supported");
}
String[] symbols = rateDefinition.getSymbols();
if (symbols != null) {
for (String symbol : symbols) {
// throw exception for particle variables, particle variable cannot be referenced
Variable var = getVariable(symbol);
if (var instanceof ParticleVariable) {
throw new MathException("Stochastic variables can not be referenced in functions and equations.");
}
if (subDomain instanceof CompartmentSubDomain) {
if ((var instanceof MembraneRegionVariable || var instanceof MemVariable)) {
throw new MathException("Volume reaction: " + pjp.getName() + " cannot reference membrane variable: " + var.getName() + ".");
}
}
}
}
}
} catch (ExpressionBindingException e) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_ExpressionBindingException, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
} catch (ExpressionException e) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_ExpressionException, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
} catch (MathException e) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_MathException, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
//
if (geometry.getDimension() == 0) {
//
if (subDomainList.size() != 1) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_1, Issue.SEVERITY_ERROR);
issueList.add(issue);
} else if (subDomainList.size() == 1) {
if (!(subDomainList.get(0) instanceof CompartmentSubDomain)) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_2, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
CompartmentSubDomain subDomain = (CompartmentSubDomain) subDomainList.get(0);
// distinguish ODE model and stochastic model
if (isNonSpatialStoch()) {
if (stochVarCount == 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_StochasticModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_STOCHASTIC_MODEL_1, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (subDomain.getJumpProcesses().size() == 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_StochasticModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_STOCHASTIC_MODEL_2, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
// check variable initial condition
for (VarIniCondition varIniCondition : subDomain.getVarIniConditions()) {
Expression iniExp = varIniCondition.getIniVal();
try {
iniExp.bindExpression(this);
} catch (Exception ex) {
ex.printStackTrace(System.out);
setWarning(ex.getMessage());
}
}
// check probability rate
for (JumpProcess jumpProcess : subDomain.getJumpProcesses()) {
Expression probExp = jumpProcess.getProbabilityRate();
try {
probExp.bindExpression(this);
} catch (Exception ex) {
ex.printStackTrace(System.out);
setWarning(ex.getMessage());
}
}
} else if (isRuleBased()) {
} else {
// ODE model
//
// Check that all equations are ODEs
//
int odeCount = 0;
Enumeration<Equation> enum_equ = subDomain.getEquations();
while (enum_equ.hasMoreElements()) {
Equation equ = enum_equ.nextElement();
if (equ instanceof OdeEquation) {
odeCount++;
} else {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_3, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
if (odeCount == 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_4, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (volVarCount != odeCount) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_5, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (memVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.MembraneVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (filVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.FilamentVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (volRegionVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.VolumeRegionVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (memRegionVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.MembraneRegionVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (filRegionVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.FilamentRegionVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
//
// spatial (PDE and ODE)
//
} else {
//
// Check that the number of CompartmentSubdomains equals the number of VolumeSubVolumes in the Geometry
// Check that the number of FilamentSubdomains equals the number of Filaments in the Geometry
//
int compartmentCount = 0;
int membraneCount = 0;
int filamentCount = 0;
int pointCount = 0;
for (int i = 0; i < subDomainList.size(); i++) {
SubDomain subDomain = (SubDomain) subDomainList.get(i);
if (subDomain instanceof CompartmentSubDomain) {
if (geometry.getGeometrySpec().getSubVolume(subDomain.getName()) == null) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_1, subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
compartmentCount++;
} else if (subDomain instanceof MembraneSubDomain) {
membraneCount++;
} else if (subDomain instanceof FilamentSubDomain) {
filamentCount++;
} else if (subDomain instanceof PointSubDomain) {
pointCount++;
} else {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_2, subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
if (geometry.getGeometrySpec().getNumSubVolumes() != compartmentCount) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_3, geometry.getGeometrySpec().getNumSubVolumes(), compartmentCount), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (geometry.getGeometrySpec().getFilamentGroup().getFilamentCount() != filamentCount) {
// setWarning("Spatial model, there are "+geometry.getGeometrySpec().getFilamentGroup().getFilamentCount()+" filaments in geometry, but "+filamentCount+" "+VCML.FilamentSubDomain+"'s, must be equal");
// return false;
}
if (filamentCount == 0 && (filVarCount > 0 || filRegionVarCount > 0)) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_4, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (membraneCount == 0 && (memVarCount > 0 || memRegionVarCount > 0)) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_5, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
//
for (int i = 0; i < subDomainList.size(); i++) {
SubDomain subDomain1 = (SubDomain) subDomainList.get(i);
for (int j = 0; j < subDomainList.size(); j++) {
if (i != j) {
SubDomain subDomain2 = (SubDomain) subDomainList.get(j);
if (subDomain1.getName().equals(subDomain2.getName())) {
Issue issue = new Issue(subDomain1, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_6, subDomain1.getName(), subDomain2.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (subDomain1 instanceof MembraneSubDomain && subDomain2 instanceof MembraneSubDomain) {
MembraneSubDomain memSubDomain1 = (MembraneSubDomain) subDomain1;
MembraneSubDomain memSubDomain2 = (MembraneSubDomain) subDomain2;
if ((memSubDomain1.getInsideCompartment() == memSubDomain2.getInsideCompartment() && memSubDomain1.getOutsideCompartment() == memSubDomain2.getOutsideCompartment()) || (memSubDomain1.getInsideCompartment() == memSubDomain2.getOutsideCompartment() && memSubDomain1.getOutsideCompartment() == memSubDomain2.getInsideCompartment())) {
Issue issue = new Issue(subDomain1, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_7, memSubDomain1.getInsideCompartment().getName(), memSubDomain1.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
}
// check periodic boundary conditons
for (int i = 0; i < subDomainList.size(); i++) {
SubDomain subDomain = (SubDomain) subDomainList.get(i);
if (subDomain instanceof CompartmentSubDomain) {
CompartmentSubDomain compartmentSubDomain = (CompartmentSubDomain) subDomain;
BoundaryConditionType bctM = compartmentSubDomain.getBoundaryConditionXm();
BoundaryConditionType bctP = compartmentSubDomain.getBoundaryConditionXp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Xm", "Xp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
bctM = compartmentSubDomain.getBoundaryConditionYm();
bctP = compartmentSubDomain.getBoundaryConditionYp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Ym", "Yp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
bctM = compartmentSubDomain.getBoundaryConditionZm();
bctP = compartmentSubDomain.getBoundaryConditionZp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Zm", "Zp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else if (subDomain instanceof MembraneSubDomain) {
MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain;
BoundaryConditionType bctM = membraneSubDomain.getBoundaryConditionXm();
BoundaryConditionType bctP = membraneSubDomain.getBoundaryConditionXp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Xm", "Xp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
bctM = membraneSubDomain.getBoundaryConditionYm();
bctP = membraneSubDomain.getBoundaryConditionYp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Ym", "Yp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
bctM = membraneSubDomain.getBoundaryConditionZm();
bctP = membraneSubDomain.getBoundaryConditionZp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Zm", "Zp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
try {
if (geometry.getGeometrySpec().getDimension() > 0) {
//
// Check that there is a MembraneSubdomain for each unique subVolume-subVolume interface in Geometry
// each ResolvedSurfaceLocation is an instance of a subVolume-subVolume interface (one-to-one with region boundaries).
//
GeometricRegion[] regions = geometry.getGeometrySurfaceDescription().getGeometricRegions();
// }
if (regions == null) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_2, Issue.SEVERITY_ERROR);
issueList.add(issue);
} else {
for (int i = 0; i < regions.length; i++) {
if (regions[i] instanceof SurfaceGeometricRegion) {
SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[i];
SubVolume subVolume1 = ((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0]).getSubVolume();
CompartmentSubDomain compartment1 = getCompartmentSubDomain(subVolume1.getName());
if (compartment1 == null) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_3, getGeometry().getName(), subVolume1.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
SubVolume subVolume2 = ((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1]).getSubVolume();
CompartmentSubDomain compartment2 = getCompartmentSubDomain(subVolume2.getName());
if (compartment2 == null) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_3, getGeometry().getName(), subVolume2.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
MembraneSubDomain membraneSubDomain = getMembraneSubDomain(compartment1, compartment2);
if (compartment2 != null && compartment1 != null && membraneSubDomain == null) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_4, compartment1.getName(), compartment2.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
//
for (int i = 0; i < subDomainList.size(); i++) {
if (subDomainList.get(i) instanceof MembraneSubDomain) {
MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomainList.get(i);
boolean bFoundSurfaceInGeometry = false;
for (int j = 0; j < regions.length; j++) {
if (regions[j] instanceof SurfaceGeometricRegion) {
SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[j];
VolumeGeometricRegion volumeRegion1 = (VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0];
VolumeGeometricRegion volumeRegion2 = (VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1];
String memInsideName = membraneSubDomain.getInsideCompartment().getName();
String memOutsideName = membraneSubDomain.getOutsideCompartment().getName();
if ((memInsideName.equals(volumeRegion1.getSubVolume().getName()) && memOutsideName.equals(volumeRegion2.getSubVolume().getName())) || (memInsideName.equals(volumeRegion2.getSubVolume().getName()) && memOutsideName.equals(volumeRegion1.getSubVolume().getName()))) {
bFoundSurfaceInGeometry = true;
break;
}
}
}
if (!bFoundSurfaceInGeometry) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_5, membraneSubDomain.getInsideCompartment().getName(), membraneSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
}
// }catch (GeometryException e){
// e.printStackTrace(System.out);
// setWarning("error validating MathDescription: "+e.getMessage());
// return false;
// }catch (ImageException e){
// e.printStackTrace(System.out);
// setWarning("error validating MathDescription: "+e.getMessage());
// return false;
// }catch (ExpressionException e){
// e.printStackTrace(System.out);
// setWarning("error validating MathDescription: "+e.getMessage());
// return false;
} catch (Exception e) {
e.printStackTrace(System.out);
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
//
for (int i = 0; i < variableList.size(); i++) {
Variable var = variableList.get(i);
String varName = var.getName();
if (var instanceof VolVariable) {
VolVariable volVar = (VolVariable) var;
int pdeRefCount = 0;
int odeRefCount = 0;
int steadyPdeCount = 0;
int measureCount = 0;
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
Equation equ = subDomain.getEquation(volVar);
if (equ instanceof PdeEquation) {
if (((PdeEquation) equ).isSteady()) {
steadyPdeCount++;
} else {
pdeRefCount++;
}
//
for (int k = 0; k < subDomainList.size(); k++) {
SubDomain subDomain2 = subDomainList.get(k);
if (subDomain2 instanceof MembraneSubDomain) {
MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain2;
if (membraneSubDomain.getInsideCompartment() == subDomain || membraneSubDomain.getOutsideCompartment() == subDomain) {
JumpCondition jumpCondition = membraneSubDomain.getJumpCondition(volVar);
BoundaryConditionValue boundaryValue = ((PdeEquation) equ).getBoundaryConditionValue(membraneSubDomain.getName());
// if PDE variable does not have jump condition OR boundaryValue (neither or both are not allowed), its an error.
if ((jumpCondition == null && boundaryValue == null) || (jumpCondition != null && boundaryValue != null)) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_10, varName, subDomain.getName(), membraneSubDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (boundaryValue != null && (subDomain.getBoundaryConditionSpec(membraneSubDomain.getName()) == null)) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_10A, varName, subDomain.getName(), membraneSubDomain.getName(), membraneSubDomain.getName(), subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
} else if (equ instanceof OdeEquation) {
odeRefCount++;
} else if (equ instanceof MeasureEquation) {
measureCount++;
}
//
if (subDomain instanceof MembraneSubDomain) {
MembraneSubDomain memSubDomain = (MembraneSubDomain) subDomain;
JumpCondition jumpCondition = memSubDomain.getJumpCondition(volVar);
if (jumpCondition != null) {
boolean bInsidePresent = (memSubDomain.getInsideCompartment().getEquation(volVar) instanceof PdeEquation);
boolean bOutsidePresent = (memSubDomain.getOutsideCompartment().getEquation(volVar) instanceof PdeEquation);
if (!bInsidePresent && !bOutsidePresent) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_11, varName, memSubDomain.getName(), memSubDomain.getInsideCompartment().getName(), memSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
//
if (!bInsidePresent && !jumpCondition.getInFluxExpression().isZero()) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_12, varName, memSubDomain.getName(), memSubDomain.getInsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (!bOutsidePresent && !jumpCondition.getOutFluxExpression().isZero()) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_13, varName, memSubDomain.getName(), memSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
if (odeRefCount > 0 && pdeRefCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_14, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (steadyPdeCount > 0 && pdeRefCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_15, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (odeRefCount == 0 && pdeRefCount == 0 && steadyPdeCount == 0 && measureCount == 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_16, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else //
if (var instanceof MemVariable) {
int pdeRefCount = 0;
int odeRefCount = 0;
int steadyPdeCount = 0;
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
Equation equ = subDomain.getEquation(var);
if (equ instanceof PdeEquation) {
if (((PdeEquation) equ).isSteady()) {
steadyPdeCount++;
} else {
pdeRefCount++;
}
} else if (equ instanceof OdeEquation) {
odeRefCount++;
}
}
if (odeRefCount > 0 && pdeRefCount > 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_14, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (steadyPdeCount > 0 && pdeRefCount > 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_15, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (odeRefCount == 0 && pdeRefCount == 0 && steadyPdeCount == 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_16, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else //
if (var instanceof FilamentVariable) {
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
if (subDomain instanceof FilamentSubDomain) {
Equation equ = subDomain.getEquation(var);
if (!(equ instanceof OdeEquation)) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_21, varName, subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
} else //
if (var instanceof VolumeRegionVariable) {
VolumeRegionVariable volRegionVar = (VolumeRegionVariable) var;
int count = 0;
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
if (subDomain instanceof CompartmentSubDomain) {
Equation equ = subDomain.getEquation(volRegionVar);
if (equ instanceof VolumeRegionEquation) {
count++;
//
for (int k = 0; k < subDomainList.size(); k++) {
SubDomain subDomain2 = subDomainList.get(k);
if (subDomain2 instanceof MembraneSubDomain) {
MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain2;
if (membraneSubDomain.getInsideCompartment() == subDomain || membraneSubDomain.getOutsideCompartment() == subDomain) {
if (membraneSubDomain.getJumpCondition(volRegionVar) == null) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_17, varName, subDomain.getName(), membraneSubDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
}
}
}
if (count == 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_18, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else //
if (var instanceof MembraneRegionVariable) {
int count = 0;
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
if (subDomain instanceof MembraneSubDomain) {
Equation equ = subDomain.getEquation(var);
if (equ instanceof MembraneRegionEquation) {
count++;
}
}
}
if (count == 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_19, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else //
if (var instanceof FilamentRegionVariable) {
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
if (subDomain instanceof FilamentSubDomain) {
Equation equ = subDomain.getEquation(var);
if (!(equ instanceof FilamentRegionEquation)) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_20, varName, subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
}
}
if (eventList.size() > 0 && isSpatial()) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_22, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
for (Event event : eventList) {
try {
event.bind(this);
} catch (ExpressionBindingException e) {
Issue issue = new Issue(event, issueContext, IssueCategory.MathDescription_SpatialModel_Event, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
for (DataGenerator dataGenerator : postProcessingBlock.getDataGeneratorList()) {
try {
dataGenerator.bind(this);
} catch (ExpressionBindingException e) {
Issue issue = new Issue(dataGenerator, issueContext, IssueCategory.MathDescription_SpatialModel_PostProcessingBlock, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
use of cbit.vcell.math.PdeEquation.BoundaryConditionValue in project vcell by virtualcell.
the class FiniteVolumeFileWriter method writeMembrane_jumpConditions.
/**
*JUMP_CONDITION_BEGIN r
*INFLUX 0.0;
*OUTFLUX 0.0;
*JUMP_CONDITION_END
* @throws ExpressionException
* @throws MathException
*/
private void writeMembrane_jumpConditions(MembraneSubDomain msd) throws ExpressionException, MathException {
Enumeration<JumpCondition> enum1 = msd.getJumpConditions();
// equations for boundaryValues for inner compartment subdomain
CompartmentSubDomain innerCompSubDomain = msd.getInsideCompartment();
Enumeration<Equation> innercompSubDomEqnsEnum = innerCompSubDomain.getEquations();
while (innercompSubDomEqnsEnum.hasMoreElements()) {
Equation eqn = innercompSubDomEqnsEnum.nextElement();
if (eqn instanceof PdeEquation) {
PdeEquation pdeEqn = (PdeEquation) eqn;
BoundaryConditionValue boundaryValue = pdeEqn.getBoundaryConditionValue(msd.getName());
if (boundaryValue != null) {
// check if the type of BoundaryConditionSpec for this membraneSubDomain (msd) in the (inner) compartmentSubDomain is Flux; if not, it cannot be handled.
BoundaryConditionSpec bcs = innerCompSubDomain.getBoundaryConditionSpec(msd.getName());
if (bcs == null) {
throw new MathException("No Boundary type specified for '" + msd.getName() + "' in '" + innerCompSubDomain.getName() + "'.");
}
if (bcs != null && !bcs.getBoundaryConditionType().compareEqual(BoundaryConditionType.getNEUMANN()) && !bChomboSolver) {
throw new MathException("Boundary type '" + bcs.getBoundaryConditionType().boundaryTypeStringValue() + "' for compartmentSubDomain '" + innerCompSubDomain.getName() + "' not handled by the chosen solver. Expecting boundary condition of type 'Flux'.");
}
if (pdeEqn.getVariable().getDomain() == null || pdeEqn.getVariable().getDomain().getName().equals(msd.getInsideCompartment().getName())) {
printWriter.println("JUMP_CONDITION_BEGIN " + pdeEqn.getVariable().getName());
Expression flux = subsituteExpression(boundaryValue.getBoundaryConditionExpression(), VariableDomain.VARIABLEDOMAIN_MEMBRANE);
String infix = replaceVolumeVariable(getSimulationTask(), msd, flux);
printWriter.println(bcs.getBoundaryConditionType().boundaryTypeStringValue().toUpperCase() + " " + msd.getInsideCompartment().getName() + " " + infix + ";");
printWriter.println("JUMP_CONDITION_END");
printWriter.println();
}
}
}
}
// equations for boundaryValues for outer compartment subdomain
CompartmentSubDomain outerCompSubDomain = msd.getOutsideCompartment();
Enumeration<Equation> outerCompSubDomEqnsEnum = outerCompSubDomain.getEquations();
while (outerCompSubDomEqnsEnum.hasMoreElements()) {
Equation eqn = outerCompSubDomEqnsEnum.nextElement();
if (eqn instanceof PdeEquation) {
PdeEquation pdeEqn = (PdeEquation) eqn;
BoundaryConditionValue boundaryValue = pdeEqn.getBoundaryConditionValue(msd.getName());
if (boundaryValue != null) {
// check if the type of BoundaryConditionSpec for this membraneSubDomain (msd) in the (inner) compartmentSubDomain is Flux; if not, it cannot be handled.
BoundaryConditionSpec bcs = outerCompSubDomain.getBoundaryConditionSpec(msd.getName());
if (bcs != null && !bcs.getBoundaryConditionType().compareEqual(BoundaryConditionType.getNEUMANN()) && !bChomboSolver) {
throw new MathException("Boundary type '" + bcs.getBoundaryConditionType().boundaryTypeStringValue() + "' for compartmentSubDomain '" + outerCompSubDomain.getName() + "' not handled by the chosen solver. Expecting boundary condition of type 'Flux'.");
}
if (pdeEqn.getVariable().getDomain() == null || pdeEqn.getVariable().getDomain().getName().equals(msd.getOutsideCompartment().getName())) {
printWriter.println("JUMP_CONDITION_BEGIN " + pdeEqn.getVariable().getName());
Expression flux = subsituteExpression(boundaryValue.getBoundaryConditionExpression(), VariableDomain.VARIABLEDOMAIN_MEMBRANE);
String infix = replaceVolumeVariable(getSimulationTask(), msd, flux);
printWriter.println(bcs.getBoundaryConditionType().boundaryTypeStringValue().toUpperCase() + " " + msd.getOutsideCompartment().getName() + " " + infix + ";");
printWriter.println("JUMP_CONDITION_END");
printWriter.println();
}
}
}
}
while (enum1.hasMoreElements()) {
JumpCondition jc = enum1.nextElement();
printWriter.println("JUMP_CONDITION_BEGIN " + jc.getVariable().getName());
// influx
if (jc.getVariable().getDomain() == null || jc.getVariable().getDomain().getName().equals(msd.getInsideCompartment().getName())) {
Expression flux = subsituteExpression(jc.getInFluxExpression(), VariableDomain.VARIABLEDOMAIN_MEMBRANE);
String infix = replaceVolumeVariable(getSimulationTask(), msd, flux);
printWriter.println(BoundaryConditionType.NEUMANN_STRING.toUpperCase() + " " + msd.getInsideCompartment().getName() + " " + infix + ";");
}
if (jc.getVariable().getDomain() == null || jc.getVariable().getDomain().getName().equals(msd.getOutsideCompartment().getName())) {
// outflux
Expression flux = subsituteExpression(jc.getOutFluxExpression(), VariableDomain.VARIABLEDOMAIN_MEMBRANE);
String infix = replaceVolumeVariable(simTask, msd, flux);
printWriter.println(BoundaryConditionType.NEUMANN_STRING.toUpperCase() + " " + msd.getOutsideCompartment().getName() + " " + infix + ";");
}
printWriter.println("JUMP_CONDITION_END");
printWriter.println();
}
}
use of cbit.vcell.math.PdeEquation.BoundaryConditionValue in project vcell by virtualcell.
the class Xmlproducer method getXML.
/**
* This methos returns a XML representation of a PdeEquation object.
* Creation date: (3/2/2001 3:21:20 PM)
* @return Element
* @param param cbit.vcell.math.PdeEquation
*/
private Element getXML(PdeEquation param) throws XmlParseException {
Element pde = new Element(XMLTags.PdeEquationTag);
// Add Atribute
pde.setAttribute(XMLTags.NameAttrTag, mangle(param.getVariable().getName()));
if (param.isSteady()) {
pde.setAttribute(XMLTags.SteadyTag, "1");
}
// Add Boundary subelements
Element boundaries = new Element(XMLTags.BoundariesTag);
// Xm
if (param.getBoundaryXm() != null) {
boundaries.setAttribute(XMLTags.BoundaryAttrValueXm, mangleExpression(param.getBoundaryXm()));
}
// Xp
if (param.getBoundaryXp() != null) {
boundaries.setAttribute(XMLTags.BoundaryAttrValueXp, mangleExpression(param.getBoundaryXp()));
}
// Ym
if (param.getBoundaryYm() != null) {
boundaries.setAttribute(XMLTags.BoundaryAttrValueYm, mangleExpression(param.getBoundaryYm()));
}
// Yp
if (param.getBoundaryYp() != null) {
boundaries.setAttribute(XMLTags.BoundaryAttrValueYp, mangleExpression(param.getBoundaryYp()));
}
// Zm
if (param.getBoundaryZm() != null) {
boundaries.setAttribute(XMLTags.BoundaryAttrValueZm, mangleExpression(param.getBoundaryZm()));
}
// Zp
if (param.getBoundaryZp() != null) {
boundaries.setAttribute(XMLTags.BoundaryAttrValueZp, mangleExpression(param.getBoundaryZp()));
}
// If is not empty, add it to the pdeEquation
if (boundaries.getAttributes().size() > 0) {
pde.addContent(boundaries);
}
// add BoundaryConditionValue
if (param.getBoundaryconditionValues().size() > 0) {
for (BoundaryConditionValue bcv : param.getBoundaryconditionValues()) {
Element bcValueElement = new Element(XMLTags.BoundaryConditionValueTag);
bcValueElement.setAttribute(XMLTags.NameAttrTag, mangle(bcv.getSubdomainName()));
bcValueElement.setAttribute(XMLTags.BoundaryValueExpressionTag, mangleExpression(bcv.getBoundaryConditionExpression()));
pde.addContent(bcValueElement);
}
}
// add Rate
Element rate = new Element(XMLTags.RateTag);
if (param.getRateExpression() != null) {
rate.addContent(mangleExpression(param.getRateExpression()));
} else {
rate.addContent(mangleExpression(new cbit.vcell.parser.Expression(0.0)));
}
pde.addContent(rate);
// Diffusion
Element diffusion = new Element(XMLTags.DiffusionTag);
if (param.getDiffusionExpression() != null) {
diffusion.addContent(mangleExpression(param.getDiffusionExpression()));
} else {
diffusion.addContent(mangleExpression(new cbit.vcell.parser.Expression(0.0)));
}
pde.addContent(diffusion);
// Initial
Element initial = new Element(XMLTags.InitialTag);
if (param.getInitialExpression() != null) {
initial.addContent(mangleExpression(param.getInitialExpression()));
pde.addContent(initial);
}
// add solution expression
switch(param.getSolutionType()) {
case Equation.UNKNOWN_SOLUTION:
{
pde.setAttribute(XMLTags.SolutionTypeTag, XMLTags.UnknownTypeTag);
if (param.getInitialExpression() == null) {
initial.setText(mangleExpression(new cbit.vcell.parser.Expression(0.0)));
pde.addContent(initial);
}
break;
}
case Equation.EXACT_SOLUTION:
{
pde.setAttribute(XMLTags.SolutionTypeTag, XMLTags.ExactTypeTag);
Element solution = new Element(XMLTags.SolutionExpressionTag);
solution.setText(mangle(param.getExactSolution().infix()));
pde.addContent(solution);
break;
}
default:
{
throw new XmlParseException("Unknown solution type:" + param.getSolutionType());
}
}
{
// add Velocity
Element velocity = null;
Expression velX = param.getVelocityX();
if (velX != null) {
velocity = new Element(XMLTags.VelocityTag);
velocity.setAttribute(XMLTags.XAttrTag, mangleExpression(velX));
}
Expression velY = param.getVelocityY();
if (velY != null) {
if (velocity == null) {
velocity = new Element(XMLTags.VelocityTag);
}
velocity.setAttribute(XMLTags.YAttrTag, mangleExpression(velY));
}
Expression velZ = param.getVelocityZ();
if (velZ != null) {
if (velocity == null) {
velocity = new Element(XMLTags.VelocityTag);
}
velocity.setAttribute(XMLTags.ZAttrTag, mangleExpression(velZ));
}
if (velocity != null) {
pde.addContent(velocity);
}
}
{
// add Grad
Element grad = null;
Expression gradX = param.getGradientX();
if (gradX != null) {
if (grad == null) {
grad = new Element(XMLTags.GradientTag);
}
grad.setAttribute(XMLTags.XAttrTag, mangleExpression(gradX));
}
Expression gradY = param.getGradientY();
if (gradY != null) {
if (grad == null) {
grad = new Element(XMLTags.GradientTag);
}
grad.setAttribute(XMLTags.YAttrTag, mangleExpression(gradY));
}
Expression gradZ = param.getGradientZ();
if (gradZ != null) {
if (grad == null) {
grad = new Element(XMLTags.GradientTag);
}
grad.setAttribute(XMLTags.ZAttrTag, mangleExpression(gradZ));
}
if (grad != null) {
pde.addContent(grad);
}
}
return pde;
}
Aggregations