Skip to content

Commit 2850d7a

Browse files
committed
accommodate existing field data files written by pyvcell
1 parent b13742a commit 2850d7a

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFVSolverStandalone.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ public void writeFieldFunctionData(OutputContext outputContext, FieldDataIdentif
167167
HashMap<FieldDataIdentifierSpec, Boolean> bFieldDataResample = new HashMap<>();
168168
int i=0;
169169
for (FieldDataIdentifierSpec fdiSpec: argFieldDataIDSpecs) {
170-
File ext_dataDir = new File(this.parentDir, fdiSpec.getFieldFuncArgs().getFieldName());
171170
if (!uniqueFieldDataIDSpecAndFileH.containsKey(fdiSpec)){
172171
File newResampledFieldDataFile = new File(dataDir, SimulationData.createCanonicalResampleFileName(getSimulationJob().getVCDataIdentifier(), fdiSpec.getFieldFuncArgs()));
173172
uniqueFieldDataIDSpecAndFileH.put(fdiSpec,newResampledFieldDataFile);
@@ -179,6 +178,9 @@ public void writeFieldFunctionData(OutputContext outputContext, FieldDataIdentif
179178
Set<Map.Entry<FieldDataIdentifierSpec, File>> resampleSet = uniqueFieldDataIDSpecAndFileH.entrySet();
180179
for (Map.Entry<FieldDataIdentifierSpec, File> resampleEntry : resampleSet) {
181180
if (resampleEntry.getValue().exists()) {
181+
// field data file has already been written
182+
// 1. in a previous loop iteration
183+
// 2. from pyvcell writing the field data file directly into this directory for an image-based field data
182184
continue;
183185
}
184186
FieldDataIdentifierSpec fieldDataIdSpec = resampleEntry.getKey();

vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import cbit.vcell.math.Variable;
88
import cbit.vcell.math.VariableType;
99
import cbit.vcell.messaging.server.SimulationTask;
10+
import cbit.vcell.parser.DivideByZeroException;
1011
import cbit.vcell.parser.Expression;
1112
import cbit.vcell.parser.ExpressionException;
13+
import cbit.vcell.simdata.DataSet;
1214
import cbit.vcell.simdata.SimDataBlock;
1315
import cbit.vcell.simdata.SimulationData;
1416
import cbit.vcell.simdata.VCData;
@@ -66,15 +68,7 @@ protected void writeFieldData() throws ExpressionException, DataAccessException
6668
);
6769
uniqueFieldDataIDSpecs.add(fieldDataIDSpec);
6870
VariableType varType = fieldDataIDSpec.getFieldFuncArgs().getVariableType();
69-
final VariableType dataVarType;
70-
try {
71-
File ext_data_dir = new File(workingDirectory.getParentFile(), ffa.getFieldName());
72-
VCData vcData = new SimulationData(fieldDataIDSpec.getExternalDataIdentifier(), ext_data_dir, ext_data_dir, null);
73-
SimDataBlock simDataBlock = vcData.getSimDataBlock(null, ffa.getVariableName(), ffa.getTime().evaluateConstant());
74-
dataVarType = simDataBlock.getVariableType();
75-
} catch (IOException e) {
76-
throw new DataAccessException("Error reading field data file: " + e.getMessage());
77-
}
71+
final VariableType dataVarType = getVariableTypeFromFieldDataFiles(fieldDataIDSpec, ffa);
7872
if (varType.equals(VariableType.UNKNOWN)) {
7973
varType = dataVarType;
8074
} else if (!varType.equals(dataVarType)) {
@@ -104,4 +98,34 @@ protected void writeFieldData() throws ExpressionException, DataAccessException
10498
printWriter.println();
10599
}
106100

101+
private VariableType getVariableTypeFromFieldDataFiles(FieldDataIdentifierSpec fieldDataIDSpec, FieldFunctionArguments ffa) throws DataAccessException {
102+
103+
try {
104+
final VariableType dataVarType;
105+
//
106+
// First, look to see if the processed field data file already exists, if so, use it to determine the variable type
107+
//
108+
DataSet dataSet = new DataSet();
109+
File existingFieldDataFile = new File(workingDirectory, SimulationData.createCanonicalResampleFileName(fieldDataIDSpec.getExternalDataIdentifier(), ffa));
110+
if (existingFieldDataFile.exists()) {
111+
// field data file may already exist
112+
// 1. from pyvcell writing the field data file directly into this directory for an image-based field data
113+
dataSet.read(existingFieldDataFile, null);
114+
int varTypeInteger = dataSet.getVariableTypeInteger(fieldDataIDSpec.getFieldFuncArgs().getVariableName());
115+
dataVarType = VariableType.getVariableTypeFromInteger(varTypeInteger);
116+
}else {
117+
//
118+
// Else, read the unprocessed simulation results referenced in the FieldDataIdentifierSpec and extract the VariableType
119+
//
120+
File ext_data_dir = new File(workingDirectory.getParentFile(), ffa.getFieldName());
121+
VCData vcData = new SimulationData(fieldDataIDSpec.getExternalDataIdentifier(), ext_data_dir, ext_data_dir, null);
122+
SimDataBlock simDataBlock = vcData.getSimDataBlock(null, ffa.getVariableName(), ffa.getTime().evaluateConstant());
123+
dataVarType = simDataBlock.getVariableType();
124+
}
125+
return dataVarType;
126+
} catch (IOException | ExpressionException | DataAccessException e) {
127+
throw new DataAccessException("Error reading field data file: " + e.getMessage());
128+
}
129+
}
130+
107131
}

0 commit comments

Comments
 (0)