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;
85 if( dim == 0 ) ents = nodes;
86 if( dim == 1 ) ents = edges;
87 if( dim == 3 ) ents = solids;
88 gids.resize( ents.
size() );
94 cGidHandle[gids[i++]] = *vit;
109 std::cout << inputfile2 <<
" has " << nodes2.
size() <<
" vertices " << edges2.
size() <<
" edges " << cells2.
size()
110 <<
" cells " << solids2.
size() <<
" solids \n";
112 Range ents2 = cells2;
113 if( dim == 0 ) ents2 = nodes2;
114 if( dim == 1 ) ents2 = edges2;
115 if( dim == 3 ) ents2 = solids2;
117 std::map< int, EntityHandle > cGidHandle2;
120 std::vector< int > gids2( ents2.
size() );
126 cGidHandle2[gids2[i++]] = *vit;
131 std::cout <<
"cannot compare tags, because number of entities is different:" << ents.
size() <<
" "
132 << ents2.
size() <<
"\n";
136 if( tag_name.length() > 0 )
143 std::cout <<
"length tag : " << len_tag <<
"\n";
149 std::cout <<
"tag data type is not integer or double, do not compare \n";
154 std::vector< double > vals;
155 std::vector< int > ivals;
158 vals.resize( len_tag * ents.
size() );
163 ivals.resize( len_tag * ents.
size() );
169 std::vector< double > vals2;
170 std::vector< int > ivals2;
173 vals2.resize( len_tag * ents2.
size() );
178 ivals2.resize( len_tag * ents2.
size() );
181 std::string new_tag_name = tag_name +
"_2";
182 Tag newTag, newTagDiff;
183 std::string tag_name_diff = tag_name +
"_diff";
186 std::vector< double > def_vald( len_tag, 0.0 );
190 "can't define new double tag" );
193 "can't define new double tag diff" );
197 std::vector< int > def_vali( len_tag, 0 );
202 "can't define new integer tag" );
205 "can't define new integer tag diff" );
212 double* val2 =
nullptr;
213 int* ival2 =
nullptr;
215 val2 = &vals2[i * len_tag];
217 ival2 = &ivals2[i * len_tag];
230 int indx = ents.
index( c1 );
233 double* diff = &vals[indx * len_tag];
234 for(
int k = 0; k < len_tag; k++ )
237 l2norm += diff[k] * diff[k];
243 int* diffi = &ivals[indx * len_tag];
244 for(
int k = 0; k < len_tag; k++ )
246 diffi[k] -= ival2[k];
247 l2norm += diffi[k] * diffi[k];
252 l2norm = sqrt( l2norm );
254 if( !outfile.empty() )
257 std::cout <<
" wrote file " << outfile <<
"\n";
259 std::cout <<
" l2norm of the diff: " << l2norm <<
"\n";
264 std::vector< Tag > list1;
267 std::map< int, int > gidMap2;
268 for(
size_t i = 0; i < ents2.
size(); i++ )
270 gidMap2[gids2[i]] = i;
275 std::vector< std::string > same_fields;
276 std::vector< std::string > skipped_fields;
277 std::vector< Tag > diffTags;
278 for(
size_t i = 0; i < list1.size(); i++ )
281 if( tag == gid )
continue;
293 if( 1 !=
length )
continue;
297 std::vector< double > vals1;
298 std::vector< int > ivals1;
301 vals1.resize( ents.
size() );
306 ivals1.resize( ents.
size() );
312 std::cout <<
" can't get values for tag " << name <<
" on model 1; skip it in comparison \n";
313 skipped_fields.push_back( name );
316 std::vector< double > vals2;
317 std::vector< int > ivals2;
320 vals2.resize( ents2.
size() );
325 ivals2.resize( ents2.
size() );
331 std::cout <<
" can't get values for tag " << name <<
" on model 2; skip it in comparison \n";
332 skipped_fields.push_back( name );
335 double minv1, maxv1, minv2, maxv2;
336 if( vals1.size() > 0 )
338 minv1 = maxv1 = vals1[0];
340 if( vals2.size() > 0 )
342 minv2 = maxv2 = vals2[0];
344 if( ivals1.size() > 0 )
346 minv1 = maxv1 = ivals1[0];
348 if( ivals2.size() > 0 )
350 minv2 = maxv2 = ivals2[0];
354 for(
size_t j = 0; j < ents.
size(); j++ )
356 double value1, value2;
362 int index2 = gidMap2[gids[j]];
364 value2 = vals2[index2];
366 value2 = ivals2[index2];
368 sum += fabs( value1 - value2 );
369 if( value1 < minv1 ) minv1 = value1;
370 if( value1 > maxv1 ) maxv1 = value1;
371 if( value2 < minv2 ) minv2 = value2;
372 if( value2 > maxv2 ) maxv2 = value2;
377 std::cout <<
" tag: " << name <<
" \t difference : " <<
sum <<
" \t min/max (" << minv1 <<
"/" << maxv1
378 <<
") \t (" << minv2 <<
"/" << maxv2 <<
") \n";
381 for(
size_t j = 0; j < ents.
size(); j++ )
383 int index2 = gidMap2[gids[j]];
385 vals1[j] -= vals2[index2];
387 ivals1[j] -= ivals2[index2];
390 std::string diffTagName = name +
"_diff";
401 diffTags.push_back( newTag );
405 same_fields.push_back( name );
409 if( k > 0 && !outfile.empty() )
412 std::cout <<
" wrote difference file: " << outfile <<
"\n";
414 std::cout <<
" different fields:" << k <<
" \n exactly the same fields:" << k1 <<
"\n";
415 std::cout <<
" number of skipped fields: " << skipped_fields.size() <<
"\n";
416 for(
size_t i = 0; i < same_fields.size(); i++ )
418 std::cout <<
" " << same_fields[i];