diff --git a/Makefile.am b/Makefile.am index 3d79e38f..420986a6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -118,7 +118,8 @@ opm/core/transport/reorder/TransportModelCompressibleTwophase.cpp \ opm/core/transport/reorder/TransportModelTwophase.cpp \ opm/core/transport/reorder/reordersequence.cpp \ opm/core/transport/reorder/nlsolvers.c \ -opm/core/transport/reorder/tarjan.c +opm/core/transport/reorder/tarjan.c \ +opm/core/vag_format/vag.cpp nobase_include_HEADERS = \ opm/core/eclipse/CornerpointChopper.hpp \ @@ -250,8 +251,8 @@ opm/core/transport/reorder/TransportModelCompressibleTwophase.hpp \ opm/core/transport/reorder/TransportModelTwophase.hpp \ opm/core/transport/reorder/nlsolvers.h \ opm/core/transport/reorder/reordersequence.h \ -opm/core/transport/reorder/tarjan.h - +opm/core/transport/reorder/tarjan.h \ +opm/core/vag_format/vag.hpp # ---------------------------------------------------------------------- # Optional library constituents. diff --git a/opm/core/vag_format/vag.cpp b/opm/core/vag_format/vag.cpp new file mode 100644 index 00000000..e4cce4fd --- /dev/null +++ b/opm/core/vag_format/vag.cpp @@ -0,0 +1,135 @@ +#include +#include +#include +#include +namespace OPM +{ + void readPosStruct(std::istream& is,int n,PosStruct& pos_struct){ + using namespace std; + //PosStruct pos_struct; + pos_struct.pos.resize(n+1); + pos_struct.pos[0]=0; + for(int i=0;i< n;++i){ + int number; + is >> number ; + //cout <> value; + // cout << value << " "; + pos_struct.value.push_back(value); + } + //cout << endl; + } + if(!(pos_struct.value.size()==pos_struct.pos[n])){ + cerr << "Failed to read pos structure" << endl; + cerr << "pos_struct.value.size()" << pos_struct.value.size() << endl; + cerr << "pos_struct.pos[n+1]" << pos_struct.pos[n] << endl; + } + }; + void readVagGrid(std::istream& is,OPM::VAG& vag_grid){ + using namespace std; + using namespace OPM; + while (!is.eof()) { + string keyword; + is >> keyword; + //cout << keyword<< endl; + if(keyword == "Number"){ + string stmp; + is >> stmp; + if(stmp == "of"){ + string entity; + is >> entity; + getline(is,stmp); + int number; + is >> number; + if(entity=="vertices"){ + vag_grid.number_of_vertices=number; + }else if((entity=="volumes") || (entity=="control")){ + vag_grid.number_of_volumes=number; + }else if(entity=="faces"){ + vag_grid.number_of_faces=number; + }else if(entity=="edges"){ + vag_grid.number_of_edges=number; + } + cout << "Found Number of: " << entity <<" " << number << endl; + } else { + cerr << "Wrong format: Not of after Number" << endl; + return; + } + }else{ + // read geometry defined by vertices + if(keyword=="Vertices"){ + int number; + is >> number; + vag_grid.vertices.resize(3*number);// assume 3d data + readVector(is,vag_grid.vertices); + } + // here starts the reding of all pos structures + else if(keyword=="Volumes->Faces" || keyword=="Volumes->faces"){ + //vag_grid.volumes_to_faces= + int number; + is >> number; + readPosStruct(is,number,vag_grid.volumes_to_faces); + cout << "Volumes->Faces: Number of " << number << endl; + }else if(keyword=="Faces->edges" || keyword=="Faces->Edges" || keyword=="Faces->Edgess"){ + int number; + is >> number; + //vag_grid.volumes_to_faces= + readPosStruct(is,number,vag_grid.faces_to_edges); + cout << "Faces->edges: Number of " << number << endl; + }else if(keyword=="Faces->Vertices" || keyword=="Faces->vertices"){ + int number; + is >> number; + //vag_grid.volumes_to_faces= + readPosStruct(is,number,vag_grid.faces_to_vertices); + cout << "Faces->Vertices: Number of " << number << endl; + }else if(keyword=="Volumes->Vertices" || keyword=="Volumes->Verticess"){ + int number; + is >> number; + //vag_grid.volumes_to_faces= + readPosStruct(is,number,vag_grid.volumes_to_vertices); + cout << "Volumes->Vertices: Number of " << number << endl; + } + + // read simple mappings + else if(keyword=="Edge" || keyword=="Edges"){ + int number; + is >> number; + vag_grid.edges.resize(2*number); + readVector(is,vag_grid.edges); + cout << "Edges: Number of " << number << endl; + }else if(keyword=="Faces->Volumes" || keyword=="Faces->Control"){ + int number; + if(keyword=="Faces->Control"){ + string vol; + is >> vol; + } + is >> number; + vag_grid.faces_to_volumes.resize(2*number); + readVector(is,vag_grid.faces_to_volumes); + cout << "Faces->Volumes: Number of " << number << endl; + } + // read material + else if(keyword=="Material"){ + string snum; + is >> snum; + int number; + is >> number; + cout << "Material number " << number << endl; + // we read all the rest into doubles + while(!is.eof()){ + double value; + is >> value; + //cout << value << endl; + vag_grid.material.push_back(value); + } + }else{ + //cout << "keyword; + } + //cout << "Found" << keyword << "Number of " << number << endl; + } + } + }; +} diff --git a/opm/core/vag_format/vag.hpp b/opm/core/vag_format/vag.hpp new file mode 100644 index 00000000..772a10d3 --- /dev/null +++ b/opm/core/vag_format/vag.hpp @@ -0,0 +1,55 @@ +#ifndef OPM_VAG_HEADER_INCLUDED +#define OPM_VAG_HEADER_INCLUDED + +#include +#include +#include +#include +namespace OPM +{ + /* Struct to hold maping from the natural number less than pos.size()-1 to + a set of integers. value(pos(i):pos(i+1)-1) hold the integers corresponding to i. + pos(end)-1==value.size(); + */ + struct PosStruct{ + std::vector pos; + std::vector value; + }; + /* Structure to represent the unstructured vag grid format + */ + struct VAG{ + int number_of_vertices; + int number_of_volumes; + int number_of_faces; + int number_of_edges; + std::vector vertices; + PosStruct volumes_to_faces; + PosStruct volumes_to_vertices; + PosStruct faces_to_edges; + PosStruct faces_to_vertices; + std::vector edges; + std::vector faces_to_volumes; + std::vector material; + }; + /* Function the vag grid format and make a vag_grid struct. This structure + is intended to be converted to a grid*/ + void readVagGrid(std::istream& is,OPM::VAG& vag_grid); + /* + void writeVagFormat(std::ostream& os){ + using namespace std; + os << "File in the Vag grid format" << endl; + }; + */ + template + void readVector(std::istream& is,std::vector& vec){ + using namespace std; + for(int i=0;i< vec.size();++i){ + is >> vec[i]; + } + } + + //PosStruct readPosStruct(std::istream& is,int n){ + void readPosStruct(std::istream& is,int n,PosStruct& pos_struct); +} + +#endif // OPE diff --git a/tests/Makefile.am b/tests/Makefile.am index 064d385c..a37cf4ae 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -21,7 +21,8 @@ test_readpolymer \ test_readvector \ test_sf2p \ test_writeVtkData \ -unit_test +unit_test \ +test_read_vag bo_resprop_test_SOURCES = bo_resprop_test.cpp monotcubicinterpolator_test_SOURCES = monotcubicinterpolator_test.cpp @@ -41,6 +42,8 @@ test_readvector_SOURCES = test_readvector.cpp test_sf2p_SOURCES = test_sf2p.cpp test_writeVtkData_SOURCES = test_writeVtkData.cpp unit_test_SOURCES = unit_test.cpp +test_read_vag_SOURCES = test_read_vag.cpp +test_read_vag_LDADD = $(LDADD) if UMFPACK noinst_PROGRAMS += test_cfs_tpfa diff --git a/tests/test_read_vag.cpp b/tests/test_read_vag.cpp new file mode 100644 index 00000000..5ced4816 --- /dev/null +++ b/tests/test_read_vag.cpp @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include +//#include "../config.h" +/* test reading of vag grid format */ +int main(int argc, char** argv) +{ + using namespace std; + using namespace OPM; + std::string filename; + if (argc == 2) { + filename = argv[1]; + } else { + std::cout << "\nUsage: test_read_vag filename\n"; + exit( 1 ); + } + ifstream is(filename.c_str());//"/home/hnil/heim/SVN/simmatlab/projects/clastic/utils/unstructuredgrids/data/3x3_w_layered-vag.dat"); + //ifstream is("/home/hnil/heim/SVN/simmatlab/projects/clastic/utils/unstructuredgrids/data/test.txt"); + //std::ofstream is(""); + VAG vag_grid; + readVagGrid(is,vag_grid); +}