Add support for reading vag/(unstructured format)

This commit is contained in:
Halvor M. Nilsen 2012-06-08 15:34:00 +02:00
parent 024f95be5d
commit bde8b53a7d
5 changed files with 222 additions and 4 deletions

View File

@ -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.

135
opm/core/vag_format/vag.cpp Normal file
View File

@ -0,0 +1,135 @@
#include <opm/core/vag_format/vag.hpp>
#include <iostream>
#include <fstream>
#include <string>
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 <<number << endl;
pos_struct.pos[i+1]=pos_struct.pos[i]+number;
for(int j=0;j< number;++j){
int value;
is >> 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;
}
}
};
}

View File

@ -0,0 +1,55 @@
#ifndef OPM_VAG_HEADER_INCLUDED
#define OPM_VAG_HEADER_INCLUDED
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
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<int> pos;
std::vector<int> 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<double> vertices;
PosStruct volumes_to_faces;
PosStruct volumes_to_vertices;
PosStruct faces_to_edges;
PosStruct faces_to_vertices;
std::vector<int> edges;
std::vector<int> faces_to_volumes;
std::vector<double> 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 <typename T>
void readVector(std::istream& is,std::vector<T>& 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

View File

@ -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

24
tests/test_read_vag.cpp Normal file
View File

@ -0,0 +1,24 @@
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <opm/core/vag_format/vag.hpp>
//#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);
}