34 int main(
int argc,
char* argv[] )
39 std::string inputfile1, inputfile2, outfile;
44 opts.
addOpt< std::string >(
"input1,i",
"input mesh filename 1", &inputfile1 );
45 opts.
addOpt< std::string >(
"input2,j",
"input mesh filename 2", &inputfile2 );
46 opts.
addOpt< std::string >(
"tagname,n",
"tag to compare (compare all tags if not specified)", &tag_name );
47 opts.
addOpt<
int >(
"dimension,d",
"topological dimension of entities to compare", &
dim );
48 opts.
addOpt< std::string >(
"outfile,o",
"output file with differences", &outfile );
60 std::cout <<
" opened " << inputfile1 <<
" and " << inputfile2 <<
" with initial h5m data.\n";
75 std::cout << inputfile1 <<
" has " << nodes.
size() <<
" vertices " << edges.
size() <<
" edges " << cells.
size()
76 <<
" cells " << solids.
size() <<
" solids \n";
80 std::map< int, EntityHandle > cGidHandle;
81 std::vector< int > gids;
86 if(
dim == 0 ) ents = nodes;
87 if(
dim == 1 ) ents = edges;
88 if(
dim == 3 ) ents = solids;
89 gids.resize( ents.
size() );
95 cGidHandle[gids[i++]] = *vit;
110 std::cout << inputfile2 <<
" has " << nodes2.
size() <<
" vertices " << edges2.
size() <<
" edges " << cells2.
size()
111 <<
" cells " << solids2.
size() <<
" solids \n";
113 Range ents2 = cells2;
114 if(
dim == 0 ) ents2 = nodes2;
115 if(
dim == 1 ) ents2 = edges2;
116 if(
dim == 3 ) ents2 = solids2;
118 std::map< int, EntityHandle > cGidHandle2;
123 std::vector< int > gids2( ents2.
size() );
128 cGidHandle2[gids2[i++]] = *vit;
133 std::cout <<
"cannot compare tags, because number of entities is different:" << ents.
size() <<
" "
134 << ents2.
size() <<
"\n";
137 if( tag_name.length() > 0 )
144 std::cout <<
"length tag : " << len_tag <<
"\n";
149 std::cout <<
"tag data type is not integer or double, do not compare \n";
153 std::vector< double > vals;
154 std::vector< int > ivals;
157 vals.resize( len_tag * ents.
size() );
162 ivals.resize( len_tag * ents.
size() );
168 std::vector< double > vals2;
169 std::vector< int > ivals2;
172 vals2.resize( len_tag * ents2.
size() );
177 ivals2.resize( len_tag * ents2.
size() );
180 std::string new_tag_name = tag_name +
"_2";
181 Tag newTag, newTagDiff;
182 std::string tag_name_diff = tag_name +
"_diff";
185 std::vector<double> def_vald(len_tag);
188 for (
size_t k=0; k<len_tag; k++)
190 rval =
mb->
tag_get_handle( tag_name_diff.c_str(), len_tag, dtype, newTagDiff,
195 std::vector<int> def_vali(len_tag);
199 for (
size_t k=0; k<len_tag; k++)
201 rval =
mb->
tag_get_handle( tag_name_diff.c_str(), len_tag, dtype, newTagDiff,
209 double *val2 =
nullptr;
210 int * ival2=
nullptr;
212 val2 = &vals2[i*len_tag];
214 ival2 = &ivals2[i*len_tag];
227 int indx = ents.
index( c1 );
230 double *diff = &vals[indx * len_tag];
231 for (
int k=0; k<len_tag; k++)
234 l2norm += diff[k] * diff[k];
240 int *diffi = &ivals[indx * len_tag];
241 for (
int k=0; k<len_tag; k++)
243 diffi[k] -= ival2[k];
244 l2norm += diffi[k] * diffi[k];
249 l2norm = sqrt( l2norm );
251 if (!outfile.empty())
254 std::cout <<
" wrote file " << outfile <<
"\n";
256 std::cout <<
" l2norm of the diff: " << l2norm <<
"\n";
262 std::vector< Tag > list1;
265 std::map< int, int > gidMap2;
266 for(
int i = 0; i < ents2.
size(); i++ )
268 gidMap2[gids2[i]] = i;
273 std::vector< std::string > same_fields;
274 std::vector< std::string > skipped_fields;
275 std::vector< Tag > diffTags;
276 for(
size_t i = 0; i < list1.size(); i++ )
279 if (tag == gid)
continue;
291 if( 1 !=
length )
continue;
295 std::vector< double > vals1;
296 std::vector< int > ivals1;
299 vals1.resize( ents.
size() );
304 ivals1.resize( ents.
size() );
310 std::cout <<
" can't get values for tag " << name <<
" on model 1; skip it in comparison \n";
311 skipped_fields.push_back( name );
314 std::vector< double > vals2;
315 std::vector< int > ivals2;
318 vals2.resize( ents2.
size() );
323 ivals2.resize( ents2.
size() );
329 std::cout <<
" can't get values for tag " << name <<
" on model 2; skip it in comparison \n";
330 skipped_fields.push_back( name );
333 double minv1, maxv1, minv2, maxv2;
334 if( vals1.size() > 0 )
336 minv1 = maxv1 = vals1[0];
338 if( vals2.size() > 0 )
340 minv2 = maxv2 = vals2[0];
342 if( ivals1.size() > 0 )
344 minv1 = maxv1 = ivals1[0];
346 if( ivals2.size() > 0 )
348 minv2 = maxv2 = ivals2[0];
352 for(
int j = 0; j < ents.
size(); j++ )
354 double value1, value2;
360 int index2 = gidMap2[gids[j]];
362 value2 = vals2[index2];
364 value2 = ivals2[index2];
366 sum += fabs( value1 - value2 );
367 if( value1 < minv1 ) minv1 = value1;
368 if( value1 > maxv1 ) maxv1 = value1;
369 if( value2 < minv2 ) minv2 = value2;
370 if( value2 > maxv2 ) maxv2 = value2;
375 std::cout <<
" tag: " << name <<
" \t difference : " <<
sum <<
" \t min/max (" << minv1 <<
"/" << maxv1
376 <<
") \t (" << minv2 <<
"/" << maxv2 <<
") \n";
379 for(
int j = 0; j < ents.
size(); j++ )
381 int index2 = gidMap2[gids[j]];
383 vals1[j] -= vals2[index2];
385 ivals1[j] -= ivals2[index2];
388 std::string diffTagName = name +
"_diff";
399 diffTags.push_back( newTag );
403 same_fields.push_back( name );
407 if( k > 0 && !outfile.empty())
410 std::cout <<
" wrote difference file: " << outfile <<
"\n";
412 std::cout <<
" different fields:" << k <<
" \n exactly the same fields:" << k1 <<
"\n";
413 std::cout <<
" number of skipped fields: " << skipped_fields.size() <<
"\n";
414 for(
size_t i = 0; i < same_fields.size(); i++ )
416 std::cout <<
" " << same_fields[i];