diff --git a/Adapter.C b/Adapter.C index 7146b1c9..dff4502b 100644 --- a/Adapter.C +++ b/Adapter.C @@ -139,21 +139,102 @@ bool preciceAdapter::Adapter::configFileRead() } DEBUG(adapterInfo(" writeData : ")); - auto writeData = interfaceDict.lookupOrDefault("writeData", wordList()); - for (auto writeDatum : writeData) + + // Check if writeData is a dictionary or list + ITstream& writeDataStream = interfaceDict.lookup("writeData"); + token firstToken = writeDataStream.peek(); + + if (firstToken == token::BEGIN_BLOCK) + { + const dictionary& writeDataDict = interfaceDict.subDict("writeData"); + for (const entry& writeDatumEntry : writeDataDict) + { + const dictionary& writeDatumDict = writeDatumEntry.dict(); + word dataName = writeDatumEntry.keyword(); + + struct fieldConfig fieldConfig; + fieldConfig.name = dataName; + fieldConfig.solver_name = writeDatumDict.lookupOrDefault("solver_name", dataName); // default solver_name is the same + fieldConfig.operation = writeDatumDict.lookupOrDefault("operation", "value"); // default operation is "value" + + interfaceConfig.writeData.push_back(fieldConfig); + + DEBUG(adapterInfo(" - " + dataName)); + DEBUG(adapterInfo(" solver_name: " + fieldConfig.solver_name)); + DEBUG(adapterInfo(" operation : " + fieldConfig.operation)); + } + } + else if (firstToken == token::BEGIN_LIST) + { + + wordList writeDataList = interfaceDict.get("writeData"); + for (const auto& dataName : writeDataList) + { + struct fieldConfig fieldConfig; + fieldConfig.name = dataName; + fieldConfig.solver_name = dataName; + fieldConfig.operation = "none"; + + interfaceConfig.writeData.push_back(fieldConfig); + + DEBUG(adapterInfo(" - " + dataName)); + } + } + else { - interfaceConfig.writeData.push_back(writeDatum); - DEBUG(adapterInfo(" - " + writeDatum)); + adapterInfo("writeData should be a dictionary or a list", "error"); } DEBUG(adapterInfo(" readData : ")); - auto readData = interfaceDict.lookupOrDefault("readData", wordList()); - for (auto readDatum : readData) + + // Check if readData is a dictionary or list + ITstream& readDataStream = interfaceDict.lookup("readData"); + firstToken = readDataStream.peek(); + + if (firstToken == token::BEGIN_BLOCK) + { + const dictionary& readDataDict = interfaceDict.subDict("readData"); + for (const entry& readDatumEntry : readDataDict) + { + const dictionary& readDatumDict = readDatumEntry.dict(); + word dataName = readDatumEntry.keyword(); + + struct fieldConfig fieldConfig; + fieldConfig.name = dataName; + fieldConfig.solver_name = readDatumDict.lookupOrDefault("solver_name", dataName); // default solver_name is the same + fieldConfig.operation = readDatumDict.lookupOrDefault("operation", "value"); // default operation is "value" + + interfaceConfig.readData.push_back(fieldConfig); + + DEBUG(adapterInfo(" - " + dataName)); + DEBUG(adapterInfo(" solver_name: " + fieldConfig.solver_name)); + DEBUG(adapterInfo(" operation : " + fieldConfig.operation)); + } + + interfacesConfig_.push_back(interfaceConfig); + } + else if (firstToken == token::BEGIN_LIST) + { + + wordList readDataList = interfaceDict.get("readData"); + for (const auto& dataName : readDataList) + { + struct fieldConfig fieldConfig; + fieldConfig.name = dataName; + fieldConfig.solver_name = dataName; + fieldConfig.operation = "none"; + + interfaceConfig.readData.push_back(fieldConfig); + + DEBUG(adapterInfo(" - " + dataName)); + } + + interfacesConfig_.push_back(interfaceConfig); + } + else { - interfaceConfig.readData.push_back(readDatum); - DEBUG(adapterInfo(" - " + readDatum)); + adapterInfo("readData should be a dictionary or a list", "error"); } - interfacesConfig_.push_back(interfaceConfig); } } } @@ -286,7 +367,7 @@ void preciceAdapter::Adapter::configure() DEBUG(adapterInfo("Adding coupling data writers...")); for (uint j = 0; j < interfacesConfig_.at(i).writeData.size(); j++) { - std::string dataName = interfacesConfig_.at(i).writeData.at(j); + std::string dataName = interfacesConfig_.at(i).writeData.at(j).name; unsigned int inModules = 0; @@ -327,7 +408,7 @@ void preciceAdapter::Adapter::configure() DEBUG(adapterInfo("Adding coupling data readers...")); for (uint j = 0; j < interfacesConfig_.at(i).readData.size(); j++) { - std::string dataName = interfacesConfig_.at(i).readData.at(j); + std::string dataName = interfacesConfig_.at(i).readData.at(j).name; unsigned int inModules = 0; diff --git a/Adapter.H b/Adapter.H index b82efa20..9709ae44 100644 --- a/Adapter.H +++ b/Adapter.H @@ -31,6 +31,14 @@ class Adapter { private: + //- field options + struct fieldConfig + { + std::string name; + std::string solver_name; + std::string operation; + }; + //- Structure of the configuration of each coupling interface. // Every interface needs to know the coupling mesh, the OpenFOAM // patches that consist the coupling surface and the kinds @@ -42,8 +50,8 @@ private: bool meshConnectivity; std::vector patchNames; std::vector cellSetNames; - std::vector writeData; - std::vector readData; + std::vector writeData; + std::vector readData; }; //- Configuration interfaces