Search in sources :

Example 71 with MathDescription

use of cbit.vcell.math.MathDescription in project vcell by virtualcell.

the class XmlReader method getMathDescription.

/**
 * This method returns a MathDescription from a XML element.
 * Creation date: (4/26/2001 12:11:14 PM)
 * @return cbit.vcell.math.MathDescription
 * @param param org.jdom.Element
 * @exception cbit.vcell.xml.XmlParseException The exception description.
 */
MathDescription getMathDescription(Element param, Geometry geometry) throws XmlParseException {
    MathDescription mathdes = null;
    Element tempelement;
    // Retrieve Metadata(Version)
    Version version = getVersion(param.getChild(XMLTags.VersionTag, vcNamespace));
    // Retrieve attributes
    String name = unMangle(param.getAttributeValue(XMLTags.NameAttrTag));
    // Create new MathDescription
    if (version != null) {
        mathdes = new MathDescription(version);
    } else {
        mathdes = new MathDescription(name);
    }
    try {
        // this step is needed!
        mathdes.setGeometry(geometry);
    } catch (java.beans.PropertyVetoException e) {
        e.printStackTrace();
        throw new XmlParseException("a PropertyVetoException was fired when setting the Geometry to the Mathdescription in the simContext " + name, e);
    }
    // set attributes
    try {
        mathdes.setName(name);
        // String annotation = param.getAttributeValue(XMLTags.AnnotationAttrTag);
        // if (annotation!=null) {
        // mathdes.setDescription(unMangle(annotation));
        // }
        // add Annotation
        String annotationText = param.getChildText(XMLTags.AnnotationTag, vcNamespace);
        if (annotationText != null && annotationText.length() > 0) {
            mathdes.setDescription(unMangle(annotationText));
        }
    } catch (java.beans.PropertyVetoException e) {
        e.printStackTrace();
        throw new XmlParseException("A PropertyVetoException was fired when setting the name " + name + ", to a new MathDescription!", e);
    }
    VariableHash varHash = new VariableHash();
    // Retrieve Constant
    Iterator<Element> iterator = param.getChildren(XMLTags.ConstantTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getConstant(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // Retrieve FilamentRegionVariables
    iterator = param.getChildren(XMLTags.FilamentRegionVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getFilamentRegionVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // Retrieve FilamentVariables
    iterator = param.getChildren(XMLTags.FilamentVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getFilamentVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // retrieve InsideVariables
    // **** This variables are for internal USE ******
    // Retrieve MembraneRegionVariable
    iterator = param.getChildren(XMLTags.MembraneRegionVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getMembraneRegionVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // Retrieve MembraneVariable
    iterator = param.getChildren(XMLTags.MembraneVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getMemVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // Retrieve PointVariable
    iterator = param.getChildren(XMLTags.PointVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getPointVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // retrieve OutsideVariables
    // **** This variables are for internal USE ******
    // Retrieve Volume Region variable
    iterator = param.getChildren(XMLTags.VolumeRegionVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getVolumeRegionVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // Retrieve VolumeVariable
    iterator = param.getChildren(XMLTags.VolumeVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getVolVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // Retrieve StochVolVariable
    iterator = param.getChildren(XMLTags.StochVolVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getStochVolVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // Retrieve all the Functions //This needs to be processed before all the variables are read!
    iterator = param.getChildren(XMLTags.FunctionTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getFunction(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    iterator = param.getChildren(XMLTags.VolumeRandomVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getRandomVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    iterator = param.getChildren(XMLTags.MembraneRandomVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getRandomVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    iterator = param.getChildren(XMLTags.VolumeParticleVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getVolumeParticalVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    iterator = param.getChildren(XMLTags.MembraneParticleVariableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getMembraneParticalVariable(tempelement));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // ParticleMolecularTypeTag       getParticleMolecularTypes
    // has to be done before VolumeParticleSpeciesPattern and VolumeParticleObservable
    iterator = param.getChildren(XMLTags.ParticleMolecularTypeTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        mathdes.addParticleMolecularType(getParticleMolecularType(tempelement));
    }
    // VolumeParticleSpeciesPatternTag
    iterator = param.getChildren(XMLTags.VolumeParticleSpeciesPatternTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getVolumeParticleSpeciesPattern(tempelement, mathdes));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // VolumeParticleObservableTag    getParticleObservables
    iterator = param.getChildren(XMLTags.VolumeParticleObservableTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            varHash.addVariable(getVolumeParticleObservable(tempelement, varHash));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException(e);
        }
    }
    // 
    try {
        mathdes.setAllVariables(varHash.getAlphabeticallyOrderedVariables());
    } catch (MathException e) {
        e.printStackTrace();
        throw new XmlParseException("Error adding the Function variables to the MathDescription " + name, e);
    } catch (ExpressionBindingException e) {
        e.printStackTrace();
        throw new XmlParseException("Error adding the Function variables to the MathDescription " + name, e);
    }
    // Retrieve CompartmentsSubdomains
    iterator = param.getChildren(XMLTags.CompartmentSubDomainTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            mathdes.addSubDomain(getCompartmentSubDomain(tempelement, mathdes));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException("Error adding a new CompartmentSubDomain to the MathDescription " + name, e);
        }
    }
    // Retrieve MembraneSubdomains
    iterator = param.getChildren(XMLTags.MembraneSubDomainTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        try {
            mathdes.addSubDomain(getMembraneSubDomain(tempelement, mathdes));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException("Error adding a new MembraneSubDomain to the MathDescription " + name, e);
        }
    }
    // Retrieve the FilamentSubdomain (if any)
    tempelement = param.getChild(XMLTags.FilamentSubDomainTag, vcNamespace);
    if (tempelement != null) {
        try {
            mathdes.addSubDomain(getFilamentSubDomain(tempelement, mathdes));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException("Error adding a new FilamentSubDomain to the MathDescription " + name, e);
        }
    }
    // Retrieve the PointSubdomain (if any)
    tempelement = param.getChild(XMLTags.PointSubDomainTag, vcNamespace);
    if (tempelement != null) {
        try {
            mathdes.addSubDomain(getPointSubDomain(tempelement, mathdes));
        } catch (MathException e) {
            e.printStackTrace();
            throw new XmlParseException("Error adding a new PointSubDomain to the MathDescription " + name, e);
        }
    }
    iterator = param.getChildren(XMLTags.EventTag, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        Event event = getEvent(mathdes, tempelement);
        try {
            mathdes.addEvent(event);
        } catch (MathException e) {
            e.printStackTrace(System.out);
            throw new XmlParseException(e);
        }
    }
    iterator = param.getChildren(XMLTags.PostProcessingBlock, vcNamespace).iterator();
    while (iterator.hasNext()) {
        tempelement = (Element) iterator.next();
        getPostProcessingBlock(mathdes, tempelement);
    }
    return mathdes;
}
Also used : PropertyVetoException(java.beans.PropertyVetoException) MathDescription(cbit.vcell.math.MathDescription) Version(org.vcell.util.document.Version) RedistributionVersion(cbit.vcell.solvers.mb.MovingBoundarySolverOptions.RedistributionVersion) SimulationVersion(org.vcell.util.document.SimulationVersion) VCellSoftwareVersion(org.vcell.util.document.VCellSoftwareVersion) VariableHash(cbit.vcell.math.VariableHash) MathException(cbit.vcell.math.MathException) Element(org.jdom.Element) Event(cbit.vcell.math.Event) BioEvent(cbit.vcell.mapping.BioEvent) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException)

Example 72 with MathDescription

use of cbit.vcell.math.MathDescription in project vcell by virtualcell.

the class MathTestingUtilities method comparePDEResults.

/**
 * Insert the method's description here.
 * Creation date: (8/20/2003 12:58:10 PM)
 */
public static SimulationComparisonSummary comparePDEResults(SimulationSymbolTable testSimSymbolTable, PDEDataManager testDataManager, SimulationSymbolTable refSimSymbolTable, PDEDataManager refDataManager, String[] varsToCompare, double absErrorThreshold, double relErrorThreshold, VCDocument refDocument, DataInfoProvider refDataInfoProvider, VCDocument testDocument, DataInfoProvider testDataInfoProvider) throws DataAccessException, ExpressionException {
    java.util.Hashtable<String, DataErrorSummary> tempVarHash = new java.util.Hashtable<String, DataErrorSummary>();
    boolean bTimesEqual = true;
    double[] testTimeArray = testDataManager.getDataSetTimes();
    double[] refTimeArray = refDataManager.getDataSetTimes();
    if (testTimeArray.length != refTimeArray.length) {
        bTimesEqual = false;
    // throw new RuntimeException("Data times for reference and test simulations don't match, cannot compare the two simulations!");
    } else {
        for (int i = 0; i < testTimeArray.length; i++) {
            if (testTimeArray[i] != refTimeArray[i]) {
                bTimesEqual = false;
            }
        }
    }
    // if (!checkSimVars(testSim, refSim)) {
    // //String errorS = "TestVars - ";
    // Variable[] testVars = testSim.getVariables();
    // //for(int i =0;i<vars.length;i+= 1){
    // //errorS+= vars[i].getName()+" ";
    // //}
    // //errorS+=" <<>> RefVars - ";
    // Variable[] refVars = refSim.getVariables();
    // //for(int i =0;i<vars.length;i+= 1){
    // //errorS+= vars[i].getName()+" ";
    // //}
    // throw new RuntimeException(
    // "VarNotMatch testLength="+(testVars != null?testVars.length+"":"null")+" refLength="+(refVars != null?refVars.length+"":"null"));
    // }
    CartesianMesh testMesh = testDataManager.getMesh();
    MathDescription testMathDesc = testSimSymbolTable.getSimulation().getMathDescription();
    // Variable[] refVars = refSim.getVariables();
    MathDescription refMathDesc = refSimSymbolTable.getSimulation().getMathDescription();
    CartesianMesh refMesh = refDataManager.getMesh();
    int[] membraneIndexMapping = null;
    // Get volumeSubdomains from mathDesc/mesh and store in lookupTable for testSimulation
    int testNumVol = testMesh.getSizeX() * testMesh.getSizeY() * testMesh.getSizeZ();
    CompartmentSubDomain[] testVolSubDomainLookup = new CompartmentSubDomain[testNumVol];
    for (int i = 0; i < testNumVol; i++) {
        int subVolumeIndex = testMesh.getSubVolumeFromVolumeIndex(i);
        SubVolume subVolume = testMathDesc.getGeometry().getGeometrySpec().getSubVolume(subVolumeIndex);
        CompartmentSubDomain compSubDomain = testMathDesc.getCompartmentSubDomain(subVolume.getName());
        testVolSubDomainLookup[i] = compSubDomain;
    }
    // Get membraneSubdomains from mathDesc/mesh and store in lookupTable for testSimulation
    int testNumMem = testMesh.getMembraneElements().length;
    MembraneSubDomain[] testMemSubDomainLookup = new MembraneSubDomain[testNumMem];
    for (int i = 0; i < testNumMem; i++) {
        int insideVolIndex = testMesh.getMembraneElements()[i].getInsideVolumeIndex();
        int outsideVolIndex = testMesh.getMembraneElements()[i].getOutsideVolumeIndex();
        MembraneSubDomain memSubDomain = testMathDesc.getMembraneSubDomain(testVolSubDomainLookup[insideVolIndex], testVolSubDomainLookup[outsideVolIndex]);
        testMemSubDomainLookup[i] = memSubDomain;
    }
    // Get volumeSubdomains from mathDesc/mesh and store in lookupTable for refSimulation
    int refNumVol = refMesh.getSizeX() * refMesh.getSizeY() * refMesh.getSizeZ();
    CompartmentSubDomain[] refVolSubDomainLookup = new CompartmentSubDomain[refNumVol];
    for (int i = 0; i < refNumVol; i++) {
        int subVolumeIndex = refMesh.getSubVolumeFromVolumeIndex(i);
        SubVolume subVolume = refMathDesc.getGeometry().getGeometrySpec().getSubVolume(subVolumeIndex);
        CompartmentSubDomain compSubDomain = refMathDesc.getCompartmentSubDomain(subVolume.getName());
        refVolSubDomainLookup[i] = compSubDomain;
    }
    // Get membraneSubdomains from mathDesc/mesh and store in lookupTable for refSimulation
    int refNumMem = refMesh.getMembraneElements().length;
    MembraneSubDomain[] refMemSubDomainLookup = new MembraneSubDomain[refNumMem];
    for (int i = 0; i < refNumMem; i++) {
        int insideVolIndex = refMesh.getMembraneElements()[i].getInsideVolumeIndex();
        int outsideVolIndex = refMesh.getMembraneElements()[i].getOutsideVolumeIndex();
        MembraneSubDomain memSubDomain = refMathDesc.getMembraneSubDomain(refVolSubDomainLookup[insideVolIndex], refVolSubDomainLookup[outsideVolIndex]);
        refMemSubDomainLookup[i] = memSubDomain;
    }
    SimulationComparisonSummary simComparisonSummary = new SimulationComparisonSummary();
    String hashKey = new String("");
    DataErrorSummary tempVar = null;
    DataIdentifier[] refDataIDs = refDataManager.getDataIdentifiers();
    // for each var, do the following :
    for (int i = 0; i < varsToCompare.length; i++) {
        DataIdentifier refDataID = null;
        for (int j = 0; j < refDataIDs.length; j++) {
            if (refDataIDs[j].getName().equals(varsToCompare[i])) {
                refDataID = refDataIDs[j];
                break;
            }
        }
        // 
        // Find REFERENCE variable
        // 
        Variable refVar = getSimVar(refSimSymbolTable, varsToCompare[i]);
        if (refVar == null) {
            // Should only happen if TEST sims were generated 'post-domains' and REFERENCE sims were generated 'pre-domains'
            if (refDataID != null) {
                throw new RuntimeException("Unexpected reference condition: '" + varsToCompare[i] + "' not found in symboltable but was found in dataidentifiers");
            }
            if (testDocument instanceof BioModel) {
                // Only BioModels need to be checked
                // Look in TEST for a speciescontext with matching species name
                System.out.println("ReferenceVariable: using alternate method to find '" + varsToCompare[i] + "'");
                BioModel refBioModel = (BioModel) refDocument;
                BioModel testBioModel = (BioModel) testDocument;
                SpeciesContext testSpeciesContext = testBioModel.getModel().getSpeciesContext(varsToCompare[i]);
                if (testSpeciesContext != null) {
                    refVar = refSimSymbolTable.getVariable(testSpeciesContext.getSpecies().getCommonName());
                    for (int j = 0; j < refDataIDs.length; j++) {
                        if (refDataIDs[j].getName().equals(testSpeciesContext.getSpecies().getCommonName())) {
                            refDataID = refDataIDs[j];
                            break;
                        }
                    }
                }
            }
            if (refVar == null || refDataID == null) {
                Simulation refSim = refSimSymbolTable.getSimulation();
                throw new RuntimeException("The variable " + varsToCompare[i] + " was not found in Simulation (" + refSim.getName() + " " + refSim.getVersion().getDate() + ")\n");
            }
        }
        // 
        // Find TEST variable (assumed to have sims generated with a software version later than REFERENCE)
        // 
        Variable testVar = getSimVar(testSimSymbolTable, varsToCompare[i]);
        if (testVar == null) {
            // Should only happen if TEST sims were generated 'post-domains' and REFERENCE sims were generated 'pre-domains'
            System.out.println("TestVariable: using alternate method to find '" + varsToCompare[i] + "'");
            BioModel testBioModel = (BioModel) testDocument;
            SpeciesContext[] speciesContexts = testBioModel.getModel().getSpeciesContexts();
            boolean bSkip = false;
            for (int j = 0; j < speciesContexts.length; j++) {
                if (speciesContexts[j].getSpecies().getCommonName().equals(varsToCompare[i])) {
                    testVar = testSimSymbolTable.getVariable(speciesContexts[j].getName());
                    if (testVar == null) {
                        throw new RuntimeException("Speciescontext name '" + speciesContexts[j].getName() + "' not found in testsimsymboltable");
                    }
                    // If we got here it means at least one matching speciescontext was found in TEST with
                    // a species name matching varsToCompare[i].  We can skip because the matching speciesconetext
                    // will be used to do a comparison at some point.
                    bSkip = true;
                    break;
                }
            }
            if (bSkip) {
                // these are tested already using full simcontext names
                System.out.println("Skipping '" + varsToCompare[i] + "' as lookup in testSimSymbolTable");
                continue;
            }
            Simulation refSim = refSimSymbolTable.getSimulation();
            throw new RuntimeException("The variable " + varsToCompare[i] + " was not found in Simulation (" + refSim.getName() + " " + refSim.getVersion().getDate() + ")\n");
        }
        // for each time in timeArray. ('t' is used to index the testTimeArray, for interpolation purposes.)
        int t = 0;
        for (int j = 0; j < refTimeArray.length; j++) {
            // get data block from varName, data from datablock
            SimDataBlock refSimDataBlock = refDataManager.getSimDataBlock(refVar.getName(), refTimeArray[j]);
            double[] refData = refSimDataBlock.getData();
            double[] resampledTestData = null;
            if (bTimesEqual) {
                // If time arrays for both sims are equal, no need to resample/interpolate, just obtain the datablock from dataManager
                SimDataBlock testSimDataBlock = testDataManager.getSimDataBlock(testVar.getName(), testTimeArray[j]);
                resampledTestData = testSimDataBlock.getData();
            } else {
                // Time resampling (interpolation) needed.
                while ((t < testTimeArray.length - 2) && (refTimeArray[j] >= testTimeArray[t + 1])) {
                    t++;
                }
                SimDataBlock testSimDataBlock_1 = testDataManager.getSimDataBlock(testVar.getName(), testTimeArray[t]);
                double[] testData_1 = testSimDataBlock_1.getData();
                SimDataBlock testSimDataBlock_2 = testDataManager.getSimDataBlock(testVar.getName(), testTimeArray[t + 1]);
                double[] testData_2 = testSimDataBlock_2.getData();
                resampledTestData = new double[testData_1.length];
                // 
                for (int m = 0; m < testData_1.length; m++) {
                    resampledTestData[m] = testData_1[m] + (testData_2[m] - testData_1[m]) * (refTimeArray[j] - testTimeArray[t]) / (testTimeArray[t + 1] - testTimeArray[t]);
                }
            }
            // Spatial resampling (interpolation) ...
            double[] spaceResampledData = new double[refData.length];
            if (!testMathDesc.getGeometry().getExtent().compareEqual(refMathDesc.getGeometry().getExtent()) || !testMathDesc.getGeometry().getOrigin().compareEqual(refMathDesc.getGeometry().getOrigin())) {
                throw new RuntimeException("Different origins and/or extents for the 2 geometries. Cannot compare the 2 simulations");
            }
            if (testMesh.getSizeX() != refMesh.getSizeX() || testMesh.getSizeY() != refMesh.getSizeY() || testMesh.getSizeZ() != refMesh.getSizeZ()) {
                if (testVar instanceof VolVariable) {
                    if (testMathDesc.getGeometry().getDimension() == 1 && refMathDesc.getGeometry().getDimension() == 1) {
                        spaceResampledData = resample1DSpatial(resampledTestData, testMesh, refMesh);
                    } else if (testMathDesc.getGeometry().getDimension() == 2 && refMathDesc.getGeometry().getDimension() == 2) {
                        spaceResampledData = resample2DSpatial(resampledTestData, testMesh, refMesh);
                    } else if (testMathDesc.getGeometry().getDimension() == 3 && refMathDesc.getGeometry().getDimension() == 3) {
                        spaceResampledData = resample3DSpatial(resampledTestData, testMesh, refMesh);
                    } else {
                        throw new RuntimeException("Comparison of 2 simulations with different geometry dimensions are not handled at this time!");
                    }
                } else {
                    throw new RuntimeException("spatial resampling for variable type: " + testVar.getClass().getName() + " not supported");
                }
            } else {
                // no space resampling required
                if (testVar instanceof MemVariable) {
                    // 
                    if (membraneIndexMapping == null) {
                        membraneIndexMapping = testMesh.getMembraneIndexMapping(refMesh);
                    }
                    spaceResampledData = new double[resampledTestData.length];
                    for (int k = 0; k < resampledTestData.length; k++) {
                        spaceResampledData[k] = resampledTestData[membraneIndexMapping[k]];
                    }
                } else {
                    // 
                    // no reordering needed for other variable types.
                    // 
                    spaceResampledData = resampledTestData;
                }
            }
            // for each point in data block ...
            testDataInfoProvider.getPDEDataContext().setVariableName(testVar.getName());
            for (int k = 0; k < refData.length; k++) {
                if (!testDataInfoProvider.isDefined(k)) {
                    continue;
                }
                // Determine maxRef, minRef, maxAbsErr for variable
                // SubDomain testSubDomain = null;
                String sn = null;
                VariableType refVarType = refDataID.getVariableType();
                if (refVarType.equals(VariableType.VOLUME)) {
                    // testSubDomain = refVolSubDomainLookup[k];
                    sn = refVolSubDomainLookup[k].getName();
                } else if (refVarType.equals(VariableType.MEMBRANE)) {
                    // testSubDomain = refMemSubDomainLookup[k];
                    sn = refMemSubDomainLookup[k].getName();
                } else if (refVarType.equals(VariableType.MEMBRANE_REGION)) {
                    sn = "MRV_" + i;
                } else if (refVarType.equals(VariableType.VOLUME_REGION)) {
                    sn = "VRV_" + i;
                } else {
                    throw new RuntimeException("Var " + refVar.getName() + " not supported yet!");
                }
                // hashKey = refVar.getName()+":"+testSubDomain.getName();
                hashKey = refVar.getName() + ":" + sn;
                tempVar = tempVarHash.get(hashKey);
                if (tempVar == null) {
                    tempVar = new DataErrorSummary(null);
                    tempVarHash.put(hashKey, tempVar);
                }
                tempVar.addDataValues(refData[k], spaceResampledData[k], refTimeArray[j], k, absErrorThreshold, relErrorThreshold);
            }
        // end for (k)
        }
    // end for (j)
    }
    // end for (i)
    Enumeration<String> enumKeys = tempVarHash.keys();
    while (enumKeys.hasMoreElements()) {
        String key = enumKeys.nextElement();
        DataErrorSummary tempVarSummary = tempVarHash.get(key);
        simComparisonSummary.addVariableComparisonSummary(new VariableComparisonSummary(key, tempVarSummary.getMinRef(), tempVarSummary.getMaxRef(), tempVarSummary.getMaxAbsoluteError(), tempVarSummary.getMaxRelativeError(), tempVarSummary.getL2Norm(), tempVarSummary.getTimeAtMaxAbsoluteError(), tempVarSummary.getIndexAtMaxAbsoluteError(), tempVarSummary.getTimeAtMaxRelativeError(), tempVarSummary.getIndexAtMaxRelativeError()));
    }
    return simComparisonSummary;
}
Also used : MembraneSubDomain(cbit.vcell.math.MembraneSubDomain) DataIdentifier(cbit.vcell.simdata.DataIdentifier) MembraneRegionVariable(cbit.vcell.math.MembraneRegionVariable) InsideVariable(cbit.vcell.math.InsideVariable) SensVariable(cbit.vcell.solver.ode.SensVariable) FilamentVariable(cbit.vcell.math.FilamentVariable) VolVariable(cbit.vcell.math.VolVariable) VolumeRegionVariable(cbit.vcell.math.VolumeRegionVariable) ReservedVariable(cbit.vcell.math.ReservedVariable) MemVariable(cbit.vcell.math.MemVariable) OutsideVariable(cbit.vcell.math.OutsideVariable) FilamentRegionVariable(cbit.vcell.math.FilamentRegionVariable) Variable(cbit.vcell.math.Variable) MathDescription(cbit.vcell.math.MathDescription) SpeciesContext(cbit.vcell.model.SpeciesContext) SimDataBlock(cbit.vcell.simdata.SimDataBlock) MemVariable(cbit.vcell.math.MemVariable) SubVolume(cbit.vcell.geometry.SubVolume) AnalyticSubVolume(cbit.vcell.geometry.AnalyticSubVolume) VariableType(cbit.vcell.math.VariableType) VolVariable(cbit.vcell.math.VolVariable) CartesianMesh(cbit.vcell.solvers.CartesianMesh) Simulation(cbit.vcell.solver.Simulation) CompartmentSubDomain(cbit.vcell.math.CompartmentSubDomain) BioModel(cbit.vcell.biomodel.BioModel)

Example 73 with MathDescription

use of cbit.vcell.math.MathDescription in project vcell by virtualcell.

the class FiniteVolumeFileWriter method writeModelDescription.

/**
 *# Model description: FEATURE name handle priority boundary_conditions
 *MODEL_BEGIN
 *FEATURE Nucleus 0 value value value value
 *FEATURE Cytosol 1 flux flux value value
 *FEATURE ExtraCellular 2 flux flux value value
 *MEMBRANE Nucleus_Cytosol_membrane Nucleus Cytosol value value value value
 *MEMBRANE Cytosol_ExtraCellular_membrane Cytosol ExtraCellular flux flux value value
 *MODEL_END
 * @throws MathException
 */
private void writeModelDescription() throws MathException {
    Simulation simulation = simTask.getSimulation();
    printWriter.println("# Model description: FEATURE name handle boundary_conditions");
    printWriter.println(FVInputFileKeyword.MODEL_BEGIN);
    MathDescription mathDesc = simulation.getMathDescription();
    Enumeration<SubDomain> enum1 = mathDesc.getSubDomains();
    while (enum1.hasMoreElements()) {
        SubDomain sd = enum1.nextElement();
        if (sd instanceof CompartmentSubDomain) {
            CompartmentSubDomain csd = (CompartmentSubDomain) sd;
            printWriter.print(FVInputFileKeyword.FEATURE + " " + csd.getName() + " " + mathDesc.getHandle(csd) + " ");
            writeFeature_boundaryConditions(csd);
        } else if (sd instanceof MembraneSubDomain) {
            MembraneSubDomain msd = (MembraneSubDomain) sd;
            printWriter.print(FVInputFileKeyword.MEMBRANE + " " + msd.getName() + " " + msd.getInsideCompartment().getName() + " " + msd.getOutsideCompartment().getName() + " ");
            writeMembrane_boundaryConditions(msd);
        }
    }
    printWriter.println(FVInputFileKeyword.MODEL_END);
    printWriter.println();
}
Also used : CompartmentSubDomain(cbit.vcell.math.CompartmentSubDomain) SubDomain(cbit.vcell.math.SubDomain) MembraneSubDomain(cbit.vcell.math.MembraneSubDomain) MembraneSubDomain(cbit.vcell.math.MembraneSubDomain) Simulation(cbit.vcell.solver.Simulation) MathDescription(cbit.vcell.math.MathDescription) CompartmentSubDomain(cbit.vcell.math.CompartmentSubDomain)

Example 74 with MathDescription

use of cbit.vcell.math.MathDescription in project vcell by virtualcell.

the class FiniteVolumeFileWriter method writeVariables.

/**
 *# Variables : type name unit time_dependent_flag advection_flag solve_whole_mesh_flag solve_regions
 *VARIABLE_BEGIN
 *VOLUME_ODE rB uM
 *VOLUME_PDE rf uM false false
 *VOLUME_PDE r uM false false
 *VOLUME_ODE rfB uM
 *VARIABLE_END
 * @throws MathException
 * @throws ExpressionException
 * @throws IOException
 */
private void writeVariables() throws MathException, ExpressionException, IOException {
    SimulationSymbolTable simSymbolTable = simTask.getSimulationJob().getSimulationSymbolTable();
    printWriter.println("# Variables : type name domain time_dependent_flag advection_flag grad_flag solve_whole_mesh_flag solve_regions");
    printWriter.println(FVInputFileKeyword.VARIABLE_BEGIN);
    MathDescription mathDesc = simSymbolTable.getSimulation().getMathDescription();
    Variable[] vars = simSymbolTable.getVariables();
    ArrayList<RandomVariable> rvList = new ArrayList<RandomVariable>();
    for (int i = 0; i < vars.length; i++) {
        String varName = vars[i].getName();
        String domainName = vars[i].getDomain() == null ? null : vars[i].getDomain().getName();
        if (vars[i] instanceof VolumeRandomVariable || vars[i] instanceof MembraneRandomVariable) {
            rvList.add((RandomVariable) vars[i]);
        } else if (vars[i] instanceof VolVariable) {
            if (bChomboSolver && domainName == null) {
                throw new MathException(simTask.getSimulation().getSolverTaskDescription().getSolverDescription().getDisplayLabel() + " requires that every variable is defined in a single domain");
            }
            VolVariable volVar = (VolVariable) vars[i];
            if (mathDesc.isPDE(volVar)) {
                boolean hasTimeVaryingDiffusionOrAdvection = simSymbolTable.hasTimeVaryingDiffusionOrAdvection(volVar);
                final boolean hasVelocity = mathDesc.hasVelocity(volVar);
                final boolean hasGradient = mathDesc.hasGradient(volVar);
                if (mathDesc.isPdeSteady(volVar)) {
                    printWriter.print("VOLUME_PDE_STEADY ");
                } else {
                    printWriter.print("VOLUME_PDE ");
                }
                printWriter.print(varName + " " + domainName + " " + hasTimeVaryingDiffusionOrAdvection + " " + hasVelocity + " " + hasGradient);
            } else {
                printWriter.print("VOLUME_ODE " + varName + " " + domainName);
            }
            if (domainName == null) {
                Vector<SubDomain> listOfSubDomains = new Vector<SubDomain>();
                int totalNumCompartments = 0;
                Enumeration<SubDomain> subDomainEnum = mathDesc.getSubDomains();
                while (subDomainEnum.hasMoreElements()) {
                    SubDomain subDomain = subDomainEnum.nextElement();
                    if (subDomain instanceof CompartmentSubDomain) {
                        CompartmentSubDomain compartmentSubDomain = (CompartmentSubDomain) subDomain;
                        totalNumCompartments++;
                        Equation varEquation = subDomain.getEquation(vars[i]);
                        if (varEquation != null) {
                            if (!(varEquation instanceof PdeEquation) || !((PdeEquation) varEquation).isDummy(simSymbolTable, compartmentSubDomain)) {
                                listOfSubDomains.add(compartmentSubDomain);
                            }
                        }
                    }
                }
                if ((totalNumCompartments == listOfSubDomains.size()) || (listOfSubDomains.size() == 0 && simTask.getSimulation().getSolverTaskDescription().getSolverDescription().equals(SolverDescription.SundialsPDE))) {
                    printWriter.print(" true");
                } else {
                    printWriter.print(" false");
                    for (int j = 0; j < listOfSubDomains.size(); j++) {
                        CompartmentSubDomain compartmentSubDomain = (CompartmentSubDomain) listOfSubDomains.elementAt(j);
                        printWriter.print(" " + compartmentSubDomain.getName());
                    }
                }
                printWriter.println();
            } else {
                printWriter.println(" false " + domainName);
            }
        } else if (vars[i] instanceof VolumeParticleVariable) {
            printWriter.println(FVInputFileKeyword.VOLUME_PARTICLE + " " + varName + " " + domainName);
        } else if (vars[i] instanceof MembraneParticleVariable) {
            printWriter.println(FVInputFileKeyword.MEMBRANE_PARTICLE + " " + varName + " " + domainName);
        } else if (vars[i] instanceof VolumeRegionVariable) {
            printWriter.println("VOLUME_REGION " + varName + " " + domainName);
        } else if (vars[i] instanceof MemVariable) {
            if (bChomboSolver && domainName == null) {
                throw new MathException(simTask.getSimulation().getSolverTaskDescription().getSolverDescription().getDisplayLabel() + " requires that every variable is defined in a single domain");
            }
            MemVariable memVar = (MemVariable) vars[i];
            if (mathDesc.isPDE(memVar)) {
                printWriter.println("MEMBRANE_PDE " + varName + " " + domainName + " " + simSymbolTable.hasTimeVaryingDiffusionOrAdvection(memVar));
            } else {
                printWriter.println("MEMBRANE_ODE " + varName + " " + domainName);
            }
        } else if (vars[i] instanceof MembraneRegionVariable) {
            printWriter.println("MEMBRANE_REGION " + varName + " " + domainName);
        } else if (vars[i] instanceof FilamentVariable) {
            throw new RuntimeException("Filament application not supported yet");
        }
    }
    int numRandomVariables = rvList.size();
    if (numRandomVariables > 0) {
        ISize samplingSize = simTask.getSimulation().getMeshSpecification().getSamplingSize();
        String[] varNameArr = new String[numRandomVariables];
        VariableType[] varTypeArr = new VariableType[numRandomVariables];
        double[][] dataArr = new double[numRandomVariables][];
        for (int i = 0; i < numRandomVariables; i++) {
            RandomVariable rv = rvList.get(i);
            varNameArr[i] = rv.getName();
            int numRandomNumbers = 0;
            if (rv instanceof VolumeRandomVariable) {
                printWriter.print("VOLUME_RANDOM");
                varTypeArr[i] = VariableType.VOLUME;
                numRandomNumbers = samplingSize.getXYZ();
            } else if (rv instanceof MembraneRandomVariable) {
                printWriter.print("MEMBRANE_RANDOM");
                varTypeArr[i] = VariableType.MEMBRANE;
                numRandomNumbers = resampledGeometry.getGeometrySurfaceDescription().getSurfaceCollection().getTotalPolygonCount();
            } else {
                throw new RuntimeException("Unknown RandomVariable type");
            }
            printWriter.println(" " + varNameArr[i]);
            dataArr[i] = generateRandomNumbers(rv, numRandomNumbers);
        }
        File rvFile = new File(workingDirectory, simTask.getSimulationJobID() + RANDOM_VARIABLE_FILE_EXTENSION);
        DataSet.writeNew(rvFile, varNameArr, varTypeArr, samplingSize, dataArr);
    }
    printWriter.println(FVInputFileKeyword.VARIABLE_END);
    printWriter.println();
}
Also used : FilamentVariable(cbit.vcell.math.FilamentVariable) VolVariable(cbit.vcell.math.VolVariable) ReservedVariable(cbit.vcell.math.ReservedVariable) ParameterVariable(cbit.vcell.math.ParameterVariable) RandomVariable(cbit.vcell.math.RandomVariable) VolumeRandomVariable(cbit.vcell.math.VolumeRandomVariable) MembraneRegionVariable(cbit.vcell.math.MembraneRegionVariable) VolumeParticleVariable(cbit.vcell.math.VolumeParticleVariable) MembraneRandomVariable(cbit.vcell.math.MembraneRandomVariable) VolumeRegionVariable(cbit.vcell.math.VolumeRegionVariable) MembraneParticleVariable(cbit.vcell.math.MembraneParticleVariable) MemVariable(cbit.vcell.math.MemVariable) Variable(cbit.vcell.math.Variable) MembraneRegionVariable(cbit.vcell.math.MembraneRegionVariable) MathDescription(cbit.vcell.math.MathDescription) ISize(org.vcell.util.ISize) ArrayList(java.util.ArrayList) MembraneRandomVariable(cbit.vcell.math.MembraneRandomVariable) RandomVariable(cbit.vcell.math.RandomVariable) VolumeRandomVariable(cbit.vcell.math.VolumeRandomVariable) MembraneRandomVariable(cbit.vcell.math.MembraneRandomVariable) CompartmentSubDomain(cbit.vcell.math.CompartmentSubDomain) SubDomain(cbit.vcell.math.SubDomain) MembraneSubDomain(cbit.vcell.math.MembraneSubDomain) PdeEquation(cbit.vcell.math.PdeEquation) VolumeRegionVariable(cbit.vcell.math.VolumeRegionVariable) MemVariable(cbit.vcell.math.MemVariable) MembraneParticleVariable(cbit.vcell.math.MembraneParticleVariable) Vector(java.util.Vector) Enumeration(java.util.Enumeration) VariableType(cbit.vcell.math.VariableType) VolVariable(cbit.vcell.math.VolVariable) SimulationSymbolTable(cbit.vcell.solver.SimulationSymbolTable) MeasureEquation(cbit.vcell.math.MeasureEquation) PdeEquation(cbit.vcell.math.PdeEquation) VolumeRegionEquation(cbit.vcell.math.VolumeRegionEquation) MembraneRegionEquation(cbit.vcell.math.MembraneRegionEquation) Equation(cbit.vcell.math.Equation) MathException(cbit.vcell.math.MathException) CompartmentSubDomain(cbit.vcell.math.CompartmentSubDomain) VolumeParticleVariable(cbit.vcell.math.VolumeParticleVariable) VolumeRandomVariable(cbit.vcell.math.VolumeRandomVariable) FilamentVariable(cbit.vcell.math.FilamentVariable) File(java.io.File)

Example 75 with MathDescription

use of cbit.vcell.math.MathDescription in project vcell by virtualcell.

the class XmlHelper method simToXML.

public static String simToXML(Simulation sim) throws XmlParseException {
    String simString = null;
    if (sim == null) {
        throw new XmlParseException("Invalid input for Simulation: " + sim);
    }
    Xmlproducer xmlProducer = new Xmlproducer(true);
    // cannot be null
    MathDescription md = sim.getMathDescription();
    Geometry geom = md.getGeometry();
    Element container = new Element(SIM_CONTAINER);
    Element mathElement = xmlProducer.getXML(md);
    Element simElement = xmlProducer.getXML(sim);
    if (geom != null) {
        Element geomElement = xmlProducer.getXML(geom);
        container.addContent(geomElement);
    } else {
        System.err.println("No corresponding geometry for the simulation: " + sim.getName());
    }
    container.addContent(mathElement);
    container.addContent(simElement);
    container = XmlUtil.setDefaultNamespace(container, Namespace.getNamespace(XMLTags.VCML_NS));
    simString = XmlUtil.xmlToString(container);
    return simString;
}
Also used : Geometry(cbit.vcell.geometry.Geometry) MathDescription(cbit.vcell.math.MathDescription) Element(org.jdom.Element)

Aggregations

MathDescription (cbit.vcell.math.MathDescription)120 Simulation (cbit.vcell.solver.Simulation)48 Geometry (cbit.vcell.geometry.Geometry)32 SimulationContext (cbit.vcell.mapping.SimulationContext)32 Variable (cbit.vcell.math.Variable)32 Expression (cbit.vcell.parser.Expression)30 ExpressionException (cbit.vcell.parser.ExpressionException)27 PropertyVetoException (java.beans.PropertyVetoException)25 BioModel (cbit.vcell.biomodel.BioModel)24 CompartmentSubDomain (cbit.vcell.math.CompartmentSubDomain)22 Constant (cbit.vcell.math.Constant)22 MathException (cbit.vcell.math.MathException)21 MathModel (cbit.vcell.mathmodel.MathModel)21 KeyValue (org.vcell.util.document.KeyValue)20 SubDomain (cbit.vcell.math.SubDomain)19 ArrayList (java.util.ArrayList)18 SubVolume (cbit.vcell.geometry.SubVolume)17 Model (cbit.vcell.model.Model)17 DataAccessException (org.vcell.util.DataAccessException)17 Function (cbit.vcell.math.Function)15