#include "moab/Core.hpp"
#include "moab/ProgOptions.hpp"
#include "moab/ReadUtilIface.hpp"
#include "math.h"
#include <map>
#include <iostream>
#include <cassert>
Go to the source code of this file.
Functions | |
int | main (int argc, char **argv) |
int main | ( | int | argc, |
char ** | argv | ||
) |
Definition at line 18 of file CompareH5mFiles.cpp.
19 {
20
21 std::string file1( "NE4pg2_imp/run/OcnCplAftMm25.h5m" );
22 std::string file2( "NE4pg2_imp2/run/OcnCplAftMm25.h5m" );
23
24 ProgOptions opts;
25
26 int dim = 2;
27 opts.addOpt< std::string >( "file1,f", "first file", &file1 );
28 opts.addOpt< std::string >( "file2,g", "second file", &file2 );
29
30 opts.addOpt<void>( "global,G", "use global id for correspondence" );
31
32
33 opts.parseCommandLine( argc, argv );
34
35 bool use_global_id = opts.numOptSet("global") > 0;
36
37 ErrorCode rval;
38 Core* mb = new Core();
39
40 rval = mb->load_file( file1.c_str() );MB_CHK_SET_ERR( rval, "can't load file1" );
41
42 Core* mb2 = new Core();
43 rval = mb2->load_file( file2.c_str() );MB_CHK_SET_ERR( rval, "can't load file2" );
44
45 std::vector< Tag > list1;
46 rval = mb->tag_get_tags( list1 );MB_CHK_SET_ERR( rval, "can't get tags 1" );
47
48 Tag gidTag = mb->globalId_tag();
49 Tag gidTag2 = mb2->globalId_tag();
50
51 Range cells1;
52 rval = mb->get_entities_by_dimension( 0, dim, cells1 );MB_CHK_SET_ERR( rval, "can't get cells 1" );
53 if( cells1.size() == 0 )
54 {
55 dim = 0;
56 rval = mb->get_entities_by_dimension( 0, dim, cells1 );MB_CHK_SET_ERR( rval, "can't get cells 1" );
57 }
58
59
60 Range cells2;
61 rval = mb2->get_entities_by_dimension( 0, dim, cells2 );MB_CHK_SET_ERR( rval, "can't get cells 2" );
62
63 if( cells1.size() != cells2.size() ) MB_CHK_SET_ERR( MB_FAILURE, "different size models " );
64 vector< double > vals1, vals2;
65 vals1.resize( cells1.size() );
66 vals2.resize( cells2.size() );
67
68 std::vector<int> gids, gids2;
69 std::map<int, int> gidMap2;
70 if (use_global_id)
71 {
72 gids.resize(cells1.size());
73 rval = mb->tag_get_data( gidTag, cells1, &gids[0] );MB_CHK_SET_ERR( rval, "can't get ids for cells1" );
74 gids2.resize(cells2.size());
75 rval = mb2->tag_get_data( gidTag2, cells2, &gids2[0] );MB_CHK_SET_ERR( rval, "can't get ids for cells2" );
76 for (int i=0; i<cells2.size(); i++)
77 {
78 gidMap2[ gids2[i] ] = i;
79 }
80 }
81
82 int k = 0; // number of different fields
83 int k1 = 0; // number of exactly the same fields
84 std::cout << " compare files: " << file1 << " and " << file2 << " dimension entity: " << dim << "\n";
85 std::vector< std::string > same_fields;
86 std::vector<Tag> diffTags;
87 for( size_t i = 0; i < list1.size(); i++ )
88 {
89 Tag tag = list1[i];
90 std::string name;
91 rval = mb->tag_get_name( tag, name );MB_CHK_SET_ERR( rval, "can't get tag name" );
92 DataType type;
93 rval = mb->tag_get_data_type( tag, type );MB_CHK_SET_ERR( rval, "can't get tag data type" );
94 if( MB_TYPE_DOUBLE != type ) continue;
95 TagType tag_type;
96 rval = mb->tag_get_type( tag, tag_type );MB_CHK_SET_ERR( rval, "can't get tag type" );
97 if( MB_TAG_DENSE != tag_type ) continue;
98 int length = 0;
99 rval = mb->tag_get_length( tag, length );MB_CHK_SET_ERR( rval, "can't get tag length" );
100 if( 1 != length ) continue;
101 Tag tag2;
102 rval = mb2->tag_get_handle( name.c_str(), tag2 );MB_CHK_SET_ERR( rval, "can't get tag on second model" );
103 rval = mb->tag_get_data( tag, cells1, &vals1[0] );MB_CHK_SET_ERR( rval, "can't get values on tag on model 1" );
104 rval = mb2->tag_get_data( tag2, cells2, &vals2[0] );MB_CHK_SET_ERR( rval, "can't get values on tag on model 2" );
105 double minv1, maxv1, minv2, maxv2;
106 if( vals1.size() > 0 )
107 {
108 minv1 = maxv1 = vals1[0];
109 }
110 if( vals2.size() > 0 )
111 {
112 minv2 = maxv2 = vals2[0];
113 }
114 // compute the difference
115 double sum = 0, value1, value2;
116 for( int j = 0; j < vals1.size(); j++ )
117 {
118 value1 = vals1[j];
119 if (use_global_id)
120 {
121
122 int index2 = gidMap2[ gids[j] ];
123 value2 = vals2[index2];
124
125 }
126 else
127 {
128 value2 = vals2[j];
129
130
131 }
132 sum += fabs( value1 - value2 );
133 if( value1 < minv1 ) minv1 = value1;
134 if( value1 > maxv1 ) maxv1 = value1;
135 if( value2 < minv2 ) minv2 = value2;
136 if( value2 > maxv2 ) maxv2 = value2;
137 }
138
139 if( sum > 0. )
140 {
141 std::cout << " tag: " << name << " \t difference : " << sum << " \t min/max (" << minv1 << "/" << maxv1
142 << ") \t (" << minv2 << "/" << maxv2 << ") \n";
143 k++;
144 if (use_global_id)
145 {
146 for (int j=0; j< vals1.size(); j++)
147 {
148 int index2 = gidMap2[ gids[j] ];
149 vals1[j] -= vals2[index2];
150 }
151 }
152 else
153 {
154 for (int j=0; j< vals1.size(); j++)
155 {
156 vals1[j] -= vals2[j];
157 }
158 }
159 std::string diffTagName = name+"_diff";
160 Tag newTag;
161 rval = mb->tag_get_handle( diffTagName.c_str(), 1, MB_TYPE_DOUBLE, newTag, MB_TAG_CREAT | MB_TAG_DENSE );MB_CHK_ERR( rval );
162 rval = mb->tag_set_data(newTag, cells1, &vals1[0]);MB_CHK_ERR( rval );
163 diffTags.push_back(newTag);
164
165 }
166 else
167 {
168 same_fields.push_back( name );
169 k1++;
170 }
171 }
172 if (k>0)
173 {
174 rval = mb->write_file("diff_tags.h5m", 0, 0, 0, 0, &diffTags[0], diffTags.size() ); MB_CHK_ERR( rval );
175 }
176 std::cout << " different fields:" << k << " \n exactly the same fields:" << k1 << "\n";
177 for( size_t i = 0; i < same_fields.size(); i++ )
178 {
179 std::cout << " " << same_fields[i];
180 }
181 std::cout << "\n";
182 // Cr
183 delete mb;
184 delete mb2;
185 }
References ProgOptions::addOpt(), dim, ErrorCode, moab::Core::get_entities_by_dimension(), moab::Core::globalId_tag(), length(), moab::Core::load_file(), mb, MB_CHK_ERR, MB_CHK_SET_ERR, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_DOUBLE, ProgOptions::numOptSet(), ProgOptions::parseCommandLine(), moab::Range::size(), moab::sum(), moab::Core::tag_get_data(), moab::Core::tag_get_data_type(), moab::Core::tag_get_handle(), moab::Core::tag_get_length(), moab::Core::tag_get_name(), moab::Core::tag_get_tags(), moab::Core::tag_get_type(), moab::Core::tag_set_data(), TagType, and moab::Core::write_file().