| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | /////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Copyright (C) Statoil ASA
 | 
					
						
							|  |  |  | //  Copyright (C) Ceetron Solutions AS
 | 
					
						
							|  |  |  | // 
 | 
					
						
							|  |  |  | //  ResInsight is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | //  it under the terms of the GNU General Public License as published by
 | 
					
						
							|  |  |  | //  the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | //  (at your option) any later version.
 | 
					
						
							|  |  |  | // 
 | 
					
						
							|  |  |  | //  ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
					
						
							|  |  |  | //  WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
					
						
							|  |  |  | //  FITNESS FOR A PARTICULAR PURPOSE.
 | 
					
						
							|  |  |  | // 
 | 
					
						
							|  |  |  | //  See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html> 
 | 
					
						
							|  |  |  | //  for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | /////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:59:24 +02:00
										 |  |  | // Get rid of warnings from compilation of ODB API
 | 
					
						
							|  |  |  | #ifdef _MSC_VER
 | 
					
						
							|  |  |  | #pragma warning(disable: 4482)
 | 
					
						
							|  |  |  | #pragma warning(disable: 4584)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | #include "RifOdbReader.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-27 10:25:04 +02:00
										 |  |  | #include "RigFemPartCollection.h"
 | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | #include "RigFemPart.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <odb_API.h>
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  | #include <odb_Enum.h>
 | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-23 15:43:11 +02:00
										 |  |  | #include <map>
 | 
					
						
							| 
									
										
										
										
											2015-04-28 09:21:27 +02:00
										 |  |  | #include <iostream>
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | #include <limits>
 | 
					
						
							| 
									
										
										
										
											2015-05-06 13:22:09 +02:00
										 |  |  | #include <sstream>
 | 
					
						
							| 
									
										
										
										
											2015-04-23 15:43:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:59:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:35:11 +02:00
										 |  |  | size_t RifOdbReader::sm_instanceCount = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-23 15:43:11 +02:00
										 |  |  | std::map<std::string, RigElementType> initFemTypeMap() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     std::map<std::string, RigElementType> typeMap; | 
					
						
							|  |  |  |     typeMap["C3D8R"] = HEX8; | 
					
						
							| 
									
										
										
										
											2015-04-28 09:21:27 +02:00
										 |  |  |     typeMap["C3D8"]  = HEX8; | 
					
						
							|  |  |  |     typeMap["C3D8P"] = HEX8; | 
					
						
							| 
									
										
										
										
											2015-04-23 15:43:11 +02:00
										 |  |  |     typeMap["CAX4"] = CAX4; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return typeMap; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:35:11 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | RigElementType toRigElementType(const odb_String& odbTypeName) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     static std::map<std::string, RigElementType> odbElmTypeToRigElmTypeMap = initFemTypeMap(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::map<std::string, RigElementType>::iterator it = odbElmTypeToRigElmTypeMap.find(odbTypeName.cStr()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (it == odbElmTypeToRigElmTypeMap.end()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  |         std::cout << "Unsupported element type :" << odbElm.type().cStr() << std::endl; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         return UNKNOWN_ELM_TYPE; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:35:11 +02:00
										 |  |  |     return  it->second; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:35:11 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  | const int* localElmNodeToIntegrationPointMapping(RigElementType elmType) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     static const int HEX8_Mapping[8] ={ 0, 1, 3, 2, 4, 5, 7, 6 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (elmType) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case HEX8: | 
					
						
							|  |  |  |             return HEX8_Mapping; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case CAX4: | 
					
						
							| 
									
										
										
										
											2015-05-12 14:35:11 +02:00
										 |  |  |             return HEX8_Mapping; // First four is identical to HEX8
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             //assert(false); // Element type not supported
 | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | RifOdbReader::RifOdbReader() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-07 15:41:19 +02:00
										 |  |  |     if (++sm_instanceCount == 1) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         odb_initializeAPI(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 	m_odb = NULL; | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | RifOdbReader::~RifOdbReader() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 	close(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 15:41:19 +02:00
										 |  |  |     if (--sm_instanceCount == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         odb_finalizeAPI(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | void RifOdbReader::close() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (m_odb) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_odb->close(); | 
					
						
							|  |  |  | 		m_odb = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-06 13:22:09 +02:00
										 |  |  | bool RifOdbReader::openFile(const std::string& fileName, std::string* errorMessage) | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | 	close(); | 
					
						
							|  |  |  | 	CVF_ASSERT(m_odb == NULL); | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | 	odb_String path = fileName.c_str(); | 
					
						
							| 
									
										
										
										
											2015-04-23 15:43:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | 	try | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_odb = &openOdb(path, true); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-24 15:53:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | 	catch (const nex_Exception& nex)  | 
					
						
							| 
									
										
										
										
											2015-04-23 15:43:11 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-05-06 13:22:09 +02:00
										 |  |  |         if (errorMessage) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             *errorMessage = nex.UserReport().CStr(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |     catch (...)  | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-05-06 13:22:09 +02:00
										 |  |  |         if (errorMessage) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             std::stringstream errStr; | 
					
						
							|  |  |  |             errStr << "Unable to open file '" << fileName << "'."; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             *errorMessage = errStr.str(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2015-04-23 15:43:11 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 10:22:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | bool RifOdbReader::buildMetaData() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(m_odb != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	m_resultsMetaData = resultsMetaData(m_odb); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | std::map<std::string, std::vector<std::string> > scalarFieldAndComponentNames(odb_Odb* odb, odb_Enum::odb_ResultPositionEnum resultPosition) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(odb != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	std::map<std::string, std::vector<std::string> > resultNamesMap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	odb_StepRepository stepRepository = odb->steps(); | 
					
						
							|  |  |  | 	odb_StepRepositoryIT sIter(stepRepository); | 
					
						
							|  |  |  | 	for (sIter.first(); !sIter.isDone(); sIter.next())  | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		odb_SequenceFrame& stepFrames = stepRepository[sIter.currentKey()].frames(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		int numFrames = stepFrames.size(); | 
					
						
							|  |  |  | 		for (int f = 0; f < numFrames; f++)  | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			odb_Frame frame = stepFrames.constGet(f); | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			odb_FieldOutputRepository& fieldCon = frame.fieldOutputs(); | 
					
						
							|  |  |  | 			odb_FieldOutputRepositoryIT fieldConIT(fieldCon); | 
					
						
							|  |  |  | 			for (fieldConIT.first(); !fieldConIT.isDone(); fieldConIT.next())  | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				odb_FieldOutput& field = fieldCon[fieldConIT.currentKey()];  | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 				odb_SequenceFieldLocation fieldLocations = field.locations(); | 
					
						
							|  |  |  | 				for (int loc = 0; loc < fieldLocations.size(); loc++) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					const odb_FieldLocation& fieldLocation = fieldLocations.constGet(loc); | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 					if (fieldLocation.position() == resultPosition) | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | 					{ | 
					
						
							|  |  |  | 						std::string fieldName = field.name().CStr(); | 
					
						
							|  |  |  | 						odb_SequenceString components = field.componentLabels(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						std::vector<std::string> compVec; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						int numComp = components.size(); | 
					
						
							|  |  |  | 						for (int comp = 0; comp < numComp; comp++) | 
					
						
							|  |  |  | 						{ | 
					
						
							|  |  |  | 							compVec.push_back(components[comp].CStr()); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						resultNamesMap.insert(std::make_pair(fieldName, compVec)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return resultNamesMap; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-06 11:09:37 +02:00
										 |  |  | std::map< RifOdbReader::ResPos, std::map<std::string, std::vector<std::string> > > RifOdbReader::resultsMetaData(odb_Odb* odb) | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(odb != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 11:09:37 +02:00
										 |  |  |     std::map< ResPos, std::map<std::string, std::vector<std::string> > > resultsMap; | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	odb_StepRepository stepRepository = odb->steps(); | 
					
						
							|  |  |  | 	odb_StepRepositoryIT sIter(stepRepository); | 
					
						
							|  |  |  | 	for (sIter.first(); !sIter.isDone(); sIter.next())  | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		odb_SequenceFrame& stepFrames = stepRepository[sIter.currentKey()].frames(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		int numFrames = stepFrames.size(); | 
					
						
							|  |  |  | 		for (int f = 0; f < numFrames; f++)  | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			odb_Frame frame = stepFrames.constGet(f); | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			odb_FieldOutputRepository& fieldCon = frame.fieldOutputs(); | 
					
						
							|  |  |  | 			odb_FieldOutputRepositoryIT fieldConIT(fieldCon); | 
					
						
							|  |  |  | 			for (fieldConIT.first(); !fieldConIT.isDone(); fieldConIT.next())  | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				odb_FieldOutput& field = fieldCon[fieldConIT.currentKey()];  | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 				odb_SequenceFieldLocation fieldLocations = field.locations(); | 
					
						
							|  |  |  | 				for (int loc = 0; loc < fieldLocations.size(); loc++) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					const odb_FieldLocation& fieldLocation = fieldLocations.constGet(loc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					std::string fieldName = field.name().CStr(); | 
					
						
							|  |  |  | 					odb_SequenceString components = field.componentLabels(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					std::vector<std::string> compVec; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					int numComp = components.size(); | 
					
						
							|  |  |  | 					for (int comp = 0; comp < numComp; comp++) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						compVec.push_back(components[comp].CStr()); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					switch (fieldLocation.position()) | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  | 						case odb_Enum::NODAL: | 
					
						
							|  |  |  |                             resultsMap[NODAL][fieldName] = compVec; | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 							break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |                         case odb_Enum::ELEMENT_NODAL: | 
					
						
							|  |  |  |                             resultsMap[ELEMENT_NODAL][fieldName] = compVec; | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 							break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  | 						case odb_Enum::INTEGRATION_POINT: | 
					
						
							|  |  |  |                             resultsMap[INTEGRATION_POINT][fieldName] = compVec; | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  |                             resultsMap[ELEMENT_NODAL][fieldName] = compVec; | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 							break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						default: | 
					
						
							|  |  |  | 							break; | 
					
						
							| 
									
										
										
										
											2015-05-06 10:22:45 +02:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return resultsMap; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | bool RifOdbReader::readFemParts(RigFemPartCollection* femParts) | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |     CVF_ASSERT(femParts); | 
					
						
							|  |  |  | 	CVF_ASSERT(m_odb != NULL); | 
					
						
							| 
									
										
										
										
											2015-04-30 14:05:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |     odb_Assembly&  rootAssembly = m_odb->rootAssembly(); | 
					
						
							|  |  |  |     odb_InstanceRepository instanceRepository = m_odb->rootAssembly().instances(); | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |     odb_InstanceRepositoryIT iter(instanceRepository); | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |     int instanceCount = 0; | 
					
						
							|  |  |  |     for (iter.first(); !iter.isDone(); iter.next(), instanceCount++) | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |         odb_Instance& inst = instanceRepository[iter.currentKey()]; | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |         RigFemPart* femPart = new RigFemPart; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Extract nodes
 | 
					
						
							|  |  |  |         const odb_SequenceNode& odbNodes = inst.nodes(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         std::map<int, int> nodeIdToIdxMap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         int nodeCount = odbNodes.size(); | 
					
						
							|  |  |  |         femPart->nodes().nodeIds.resize(nodeCount); | 
					
						
							|  |  |  |         femPart->nodes().coordinates.resize(nodeCount); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (int nIdx = 0; nIdx < nodeCount; ++nIdx) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             const odb_Node odbNode = odbNodes.node(nIdx); | 
					
						
							|  |  |  |             femPart->nodes().nodeIds[nIdx] = odbNode.label(); | 
					
						
							|  |  |  |             const float * pos = odbNode.coordinates(); | 
					
						
							|  |  |  |             femPart->nodes().coordinates[nIdx].set(pos[0], pos[1], pos[2]); | 
					
						
							|  |  |  |             nodeIdToIdxMap[odbNode.label()] = nIdx; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |         // Keep node id to index map per instance
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |         m_nodeIdToIdxMaps.push_back(nodeIdToIdxMap); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |         // Extract elements
 | 
					
						
							|  |  |  |         const odb_SequenceElement& elements = inst.elements(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         int elmCount = elements.size(); | 
					
						
							|  |  |  |         femPart->preAllocateElementStorage(elmCount); | 
					
						
							|  |  |  |         std::map<std::string, RigElementType>::const_iterator it; | 
					
						
							|  |  |  |         std::vector<int> indexBasedConnectivities; | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |         std::map<int, int> elementIdToIdxMap; | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for (int elmIdx = 0; elmIdx < elmCount; ++elmIdx) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             const odb_Element odbElm = elements.element(elmIdx); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |             elementIdToIdxMap[odbElm.label()] = elmIdx; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:35:11 +02:00
										 |  |  |             RigElementType elmType = toRigElementType(odbElm.type()); | 
					
						
							|  |  |  |             if (elmType == UNKNOWN_ELM_TYPE) continue; | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             int nodeCount = 0; | 
					
						
							|  |  |  |             const int* idBasedConnectivities = odbElm.connectivity(nodeCount); | 
					
						
							|  |  |  |             CVF_TIGHT_ASSERT(nodeCount == RigFemTypes::elmentNodeCount(elmType)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             indexBasedConnectivities.resize(nodeCount); | 
					
						
							|  |  |  |             for (int lnIdx = 0; lnIdx < nodeCount; ++lnIdx) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 indexBasedConnectivities[lnIdx] = nodeIdToIdxMap[idBasedConnectivities[lnIdx]]; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             femPart->appendElement(elmType, odbElm.label(), indexBasedConnectivities.data()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |         // Keep element id to index map per instance
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |         m_elementIdToIdxMaps.push_back(elementIdToIdxMap); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  |         femPart->setElementPartId(femParts->partCount()); | 
					
						
							|  |  |  |         femParts->addFemPart(femPart); | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 11:03:20 +02:00
										 |  |  | 	return true; | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | std::vector<std::string> RifOdbReader::stepNames() | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(m_odb != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	std::vector<std::string> stepNames; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	odb_StepRepository stepRepository = m_odb->steps(); | 
					
						
							|  |  |  | 	odb_StepRepositoryIT sIter(stepRepository); | 
					
						
							|  |  |  | 	for (sIter.first(); !sIter.isDone(); sIter.next())  | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		stepNames.push_back(stepRepository[sIter.currentKey()].name().CStr()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return stepNames; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | std::vector<double> RifOdbReader::frameTimes(int stepIndex) | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(m_odb != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	odb_StepRepository& stepRepository = m_odb->steps(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	odb_StepList stepList = stepRepository.stepList(); | 
					
						
							|  |  |  | 	odb_Step& step = stepList.Get(stepIndex); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	odb_SequenceFrame& stepFrames = step.frames(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	std::vector<double> frameValues; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int numFrames = stepFrames.size(); | 
					
						
							|  |  |  | 	for (int f = 0; f < numFrames; f++)  | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		odb_Frame frame = stepFrames.constGet(f); | 
					
						
							|  |  |  | 		frameValues.push_back(frame.frameValue()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return frameValues; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | std::map<std::string, std::vector<std::string> > RifOdbReader::scalarNodeFieldAndComponentNames() | 
					
						
							| 
									
										
										
										
											2015-04-23 13:24:15 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |     return fieldAndComponentNames(NODAL); | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | std::map<std::string, std::vector<std::string> > RifOdbReader::scalarElementNodeFieldAndComponentNames() | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |     return fieldAndComponentNames(ELEMENT_NODAL); | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | std::map<std::string, std::vector<std::string> > RifOdbReader::scalarIntegrationPointFieldAndComponentNames() | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |     return fieldAndComponentNames(INTEGRATION_POINT); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | odb_Frame RifOdbReader::stepFrame(int stepIndex, int frameIndex) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(m_odb); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	odb_StepRepository& stepRepository = m_odb->steps(); | 
					
						
							|  |  |  | 	odb_StepList stepList = stepRepository.stepList(); | 
					
						
							|  |  |  | 	odb_Step& step = stepList.Get(stepIndex); | 
					
						
							|  |  |  | 	odb_SequenceFrame& stepFrames = step.frames(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return stepFrames.constGet(frameIndex); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | odb_Instance* RifOdbReader::instance(int instanceIndex) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     CVF_ASSERT(m_odb != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     odb_Assembly& rootAssembly = m_odb->rootAssembly(); | 
					
						
							|  |  |  |     odb_InstanceRepository& instanceRepository = m_odb->rootAssembly().instances(); | 
					
						
							|  |  |  |     odb_InstanceRepositoryIT iter(instanceRepository); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int instanceCount = 0; | 
					
						
							|  |  |  |     for (iter.first(); !iter.isDone(); iter.next(), instanceCount++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         odb_Instance& inst = instanceRepository[iter.currentKey()]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (instanceCount == instanceIndex) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return &inst; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// Get the number of result items (== #nodes or #elements)
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-06 13:32:14 +02:00
										 |  |  | size_t RifOdbReader::resultItemCount(const std::string& fieldName, int partIndex, int stepIndex, int frameIndex) | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-06 13:32:14 +02:00
										 |  |  |     odb_Instance* partInstance = instance(partIndex); | 
					
						
							|  |  |  |     CVF_ASSERT(partInstance != NULL); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 13:32:14 +02:00
										 |  |  | 	const odb_Frame& frame = stepFrame(stepIndex, frameIndex); | 
					
						
							|  |  |  | 	const odb_FieldOutput& instanceFieldOutput = frame.fieldOutputs()[fieldName.c_str()].getSubset(*partInstance); | 
					
						
							|  |  |  | 	const odb_SequenceFieldBulkData& seqFieldBulkData = instanceFieldOutput.bulkDataBlocks(); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	size_t resultItemCount = 0; | 
					
						
							|  |  |  | 	int numBlocks = seqFieldBulkData.size(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int block = 0; block < numBlocks; block++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const odb_FieldBulkData& bulkData =	seqFieldBulkData[block]; | 
					
						
							|  |  |  | 		resultItemCount += bulkData.length(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return resultItemCount; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-06 11:09:37 +02:00
										 |  |  | int RifOdbReader::componentIndex(ResPos position, const std::string& fieldName, const std::string& componentName) const | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 	std::vector<std::string> compNames = componentNames(position, fieldName); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (size_t i = 0; i < compNames.size(); i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (compNames[i] == componentName) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return i; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-06 11:09:37 +02:00
										 |  |  | std::vector<std::string> RifOdbReader::componentNames(ResPos position, const std::string& fieldName) const | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	std::vector<std::string> compNames; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |     std::map< ResPos, std::map<std::string, std::vector<std::string> > >::const_iterator posMapIt = m_resultsMetaData.find(position); | 
					
						
							| 
									
										
										
										
											2015-05-06 10:22:45 +02:00
										 |  |  | 	if (posMapIt != m_resultsMetaData.end()) | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |         std::map<std::string, std::vector<std::string> >::const_iterator fieldNameMapIt = posMapIt->second.find(fieldName); | 
					
						
							| 
									
										
										
										
											2015-05-06 10:22:45 +02:00
										 |  |  | 	    if (fieldNameMapIt != posMapIt->second.end()) | 
					
						
							|  |  |  | 	    { | 
					
						
							|  |  |  |             compNames = fieldNameMapIt->second; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 	return compNames; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-05-06 11:09:37 +02:00
										 |  |  | std::map<std::string, std::vector<std::string> > RifOdbReader::fieldAndComponentNames(ResPos position) | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (m_resultsMetaData.empty()) | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2015-05-04 14:31:12 +02:00
										 |  |  | 		buildMetaData(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 10:22:45 +02:00
										 |  |  |     return m_resultsMetaData[position]; | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | void RifOdbReader::readScalarNodeField(const std::string& fieldName, const std::string& componentName, int partIndex, int stepIndex, int frameIndex, std::vector<float>* resultValues) | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(resultValues); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |     odb_Instance* partInstance = instance(partIndex); | 
					
						
							|  |  |  |     CVF_ASSERT(partInstance != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |     std::map<int, int>& nodeIdToIdxMap = m_nodeIdToIdxMaps[partIndex]; | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |     size_t dataSize = nodeIdToIdxMap.size(); | 
					
						
							|  |  |  |     CVF_ASSERT(dataSize > 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	resultValues->resize(dataSize); | 
					
						
							|  |  |  |     resultValues->assign(dataSize, std::numeric_limits<float>::infinity()); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  | 	int compIndex = componentIndex(NODAL, fieldName, componentName); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 	CVF_ASSERT(compIndex >= 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const odb_Frame& frame = stepFrame(stepIndex, frameIndex); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 	const odb_FieldOutput& instanceFieldOutput = frame.fieldOutputs()[fieldName.c_str()].getSubset(*partInstance); | 
					
						
							|  |  |  | 	const odb_FieldOutput& fieldOutput = instanceFieldOutput.getSubset(odb_Enum::NODAL); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 	const odb_SequenceFieldBulkData& seqFieldBulkData = fieldOutput.bulkDataBlocks(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	size_t dataIndex = 0; | 
					
						
							|  |  |  | 	int numBlocks = seqFieldBulkData.size(); | 
					
						
							|  |  |  | 	for (int block = 0; block < numBlocks; block++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const odb_FieldBulkData& bulkData =	seqFieldBulkData[block]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 		int numNodes = bulkData.length(); | 
					
						
							|  |  |  | 		int numComp = bulkData.width(); | 
					
						
							|  |  |  | 		float* data = bulkData.data(); | 
					
						
							|  |  |  |         int* nodeLabels = bulkData.nodeLabels(); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 		for (int i = 0; i < numNodes; i++) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  |             (*resultValues)[nodeIdToIdxMap[nodeLabels[i]]] = data[i*numComp + compIndex]; | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | void RifOdbReader::readScalarElementNodeField(const std::string& fieldName, const std::string& componentName, int partIndex, int stepIndex, int frameIndex, std::vector<float>* resultValues) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(resultValues); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |     odb_Instance* partInstance = instance(partIndex); | 
					
						
							|  |  |  |     CVF_ASSERT(partInstance != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |     std::map<int, int>& elementIdToIdxMap = m_elementIdToIdxMaps[partIndex]; | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |     CVF_ASSERT(elementIdToIdxMap.size() > 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 13:32:14 +02:00
										 |  |  |     size_t dataSize = resultItemCount(fieldName, partIndex, stepIndex, frameIndex); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	if (dataSize > 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		resultValues->resize(dataSize); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |         resultValues->assign(dataSize, std::numeric_limits<float>::infinity()); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  | 	int compIndex = componentIndex(ELEMENT_NODAL, fieldName, componentName); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	CVF_ASSERT(compIndex >= 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const odb_Frame& frame = stepFrame(stepIndex, frameIndex); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 	const odb_FieldOutput& instanceFieldOutput = frame.fieldOutputs()[fieldName.c_str()].getSubset(*partInstance); | 
					
						
							|  |  |  |     const odb_FieldOutput& fieldOutput = instanceFieldOutput.getSubset(odb_Enum::ELEMENT_NODAL); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	const odb_SequenceFieldBulkData& seqFieldBulkData = fieldOutput.bulkDataBlocks(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	size_t dataIndex = 0; | 
					
						
							|  |  |  | 	int numBlocks = seqFieldBulkData.size(); | 
					
						
							|  |  |  | 	for (int block = 0; block < numBlocks; block++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const odb_FieldBulkData& bulkData =	seqFieldBulkData[block]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 		int numValues = bulkData.length(); | 
					
						
							|  |  |  | 		int numComp = bulkData.width(); | 
					
						
							|  |  |  | 		float* data = bulkData.data(); | 
					
						
							|  |  |  |         int elemCount = bulkData.numberOfElements(); | 
					
						
							|  |  |  | 		int elemNodeCount = numValues/elemCount; | 
					
						
							|  |  |  | 		int* elementLabels = bulkData.elementLabels(); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |         for (int elem = 0; elem < elemCount; elem++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             int elementIdx = elementIdToIdxMap[elementLabels[elem*elemNodeCount]]; | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  |             int elementResultStartDestIdx = elementIdx*elemNodeCount; // Ikke generellt riktig !
 | 
					
						
							|  |  |  |             int elementResultStartSourceIdx = elem*elemNodeCount*numComp; | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             for (int elemNode = 0; elemNode < elemNodeCount; elemNode++) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  |                 int destIdx = elementResultStartDestIdx + elemNode; | 
					
						
							|  |  |  |                 int srcIdx = elementResultStartSourceIdx + elemNode*numComp + compIndex; | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |                 (*resultValues)[destIdx] = data[srcIdx]; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | void RifOdbReader::readScalarIntegrationPointField(const std::string& fieldName, const std::string& componentName, int partIndex, int stepIndex, int frameIndex, std::vector<float>* resultValues) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(resultValues); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |     odb_Instance* partInstance = instance(partIndex); | 
					
						
							|  |  |  |     CVF_ASSERT(partInstance != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  |     std::map<int, int>& elementIdToIdxMap = m_elementIdToIdxMaps[partIndex]; | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |     CVF_ASSERT(elementIdToIdxMap.size() > 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 13:32:14 +02:00
										 |  |  |    	size_t dataSize = resultItemCount(fieldName, partIndex, stepIndex, frameIndex); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	if (dataSize > 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		resultValues->resize(dataSize); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |         resultValues->assign(dataSize, std::numeric_limits<float>::infinity()); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 12:23:55 +02:00
										 |  |  | 	int compIndex = componentIndex(INTEGRATION_POINT, fieldName, componentName); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	CVF_ASSERT(compIndex >= 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const odb_Frame& frame = stepFrame(stepIndex, frameIndex); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 	const odb_FieldOutput& instanceFieldOutput = frame.fieldOutputs()[fieldName.c_str()].getSubset(*partInstance); | 
					
						
							|  |  |  |     const odb_FieldOutput& fieldOutput = instanceFieldOutput.getSubset(odb_Enum::INTEGRATION_POINT); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	const odb_SequenceFieldBulkData& seqFieldBulkData = fieldOutput.bulkDataBlocks(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	size_t dataIndex = 0; | 
					
						
							|  |  |  | 	int numBlocks = seqFieldBulkData.size(); | 
					
						
							|  |  |  | 	for (int block = 0; block < numBlocks; block++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const odb_FieldBulkData& bulkData =	seqFieldBulkData[block]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 		int numValues = bulkData.length(); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 		int numComp = bulkData.width(); | 
					
						
							|  |  |  | 		float* data = bulkData.data(); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |         int elemCount = bulkData.numberOfElements(); | 
					
						
							|  |  |  | 		int ipCount = numValues/elemCount; | 
					
						
							|  |  |  | 		int* elementLabels = bulkData.elementLabels(); | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  |         RigElementType eType = toRigElementType(bulkData.baseElementType()); | 
					
						
							|  |  |  |         const int* elmNodeToIpResultMapping = localElmNodeToIntegrationPointMapping(eType); | 
					
						
							|  |  |  |         if (!elmNodeToIpResultMapping) continue; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |         for (int elem = 0; elem < elemCount; elem++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             int elementIdx = elementIdToIdxMap[elementLabels[elem*ipCount]]; | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  |             int elementResultStartDestIdx = elementIdx*ipCount; // Ikke generellt riktig !
 | 
					
						
							|  |  |  |             int elementResultStartSourceIdx = elem*ipCount*numComp; | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  |             for (int ipIdx = 0; ipIdx < ipCount; ipIdx++) | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2015-05-12 14:22:26 +02:00
										 |  |  |                 int resultIpIdx = elmNodeToIpResultMapping[ipIdx]; | 
					
						
							|  |  |  |                 int destIdx = elementResultStartDestIdx + ipIdx;  | 
					
						
							|  |  |  |                 int srcIdx  = elementResultStartSourceIdx + resultIpIdx*numComp + compIndex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |                 (*resultValues)[destIdx] = data[srcIdx]; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-05-05 09:39:35 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-30 13:59:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | /// 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | void RifOdbReader::readDisplacements(int partIndex, int stepIndex, int frameIndex, std::vector<cvf::Vec3f>* displacements) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CVF_ASSERT(displacements); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  |     odb_Instance* partInstance = instance(partIndex); | 
					
						
							|  |  |  |     CVF_ASSERT(partInstance != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-06 13:32:14 +02:00
										 |  |  | 	size_t dataSize = resultItemCount("U", partIndex, stepIndex, frameIndex); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 	if (dataSize > 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		displacements->resize(dataSize); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const odb_Frame& frame = stepFrame(stepIndex, frameIndex); | 
					
						
							| 
									
										
										
										
											2015-05-06 09:47:19 +02:00
										 |  |  | 	const odb_FieldOutput& instanceFieldOutput = frame.fieldOutputs()["U"].getSubset(*partInstance); | 
					
						
							|  |  |  | 	const odb_SequenceFieldBulkData& seqFieldBulkData = instanceFieldOutput.bulkDataBlocks(); | 
					
						
							| 
									
										
										
										
											2015-04-30 09:31:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	size_t dataIndex = 0; | 
					
						
							|  |  |  | 	int numBlocks = seqFieldBulkData.size(); | 
					
						
							|  |  |  | 	for (int block = 0; block < numBlocks; block++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const odb_FieldBulkData& bulkData =	seqFieldBulkData[block]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (bulkData.numberOfNodes() > 0) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			int numNodes = bulkData.length(); | 
					
						
							|  |  |  | 			int numComp = bulkData.width(); | 
					
						
							|  |  |  | 			float* data = bulkData.data(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for (int i = 0; i < numNodes; i++) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				(*displacements)[i + dataIndex].set(data[i*numComp], data[i*numComp + 1], data[i*numComp + 2]); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			dataIndex += numNodes*numComp; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |