@@ -168,12 +168,18 @@ void HDF5Writer::writeArray(hid_t group, const std::string& name, int patch,
168168 space = H5Screate_simple (1 ,& siz ,nullptr );
169169 std ::stringstream str ;
170170 str << patch ;
171- set = H5Dcreate2 (group1 ,str .str ().c_str (),
172- type ,space ,H5P_DEFAULT ,H5P_DEFAULT ,H5P_DEFAULT );
171+ if (checkGroupExistence (group1 ,str .str ().c_str ()))
172+ set = H5Dopen2 (group1 ,str .str ().c_str (),H5P_DEFAULT );
173+ else
174+ set = H5Dcreate2 (group1 ,str .str ().c_str (),
175+ type ,space ,H5P_DEFAULT ,H5P_DEFAULT ,H5P_DEFAULT );
173176 } else {
174177 space = H5Screate_simple (1 ,& siz ,nullptr );
175- set = H5Dcreate2 (group ,name .c_str (),
176- type ,space ,H5P_DEFAULT ,H5P_DEFAULT ,H5P_DEFAULT );
178+ if (checkGroupExistence (group ,name .c_str ()))
179+ set = H5Dopen2 (group ,name .c_str (),H5P_DEFAULT );
180+ else
181+ set = H5Dcreate2 (group ,name .c_str (),
182+ type ,space ,H5P_DEFAULT ,H5P_DEFAULT ,H5P_DEFAULT );
177183 }
178184 if (len > 0 ) {
179185 hid_t file_space = H5Dget_space (set );
@@ -185,6 +191,7 @@ void HDF5Writer::writeArray(hid_t group, const std::string& name, int patch,
185191 H5Sclose (mem_space );
186192 H5Sclose (file_space );
187193 }
194+ H5Dflush (set );
188195 H5Dclose (set );
189196 H5Sclose (space );
190197 if (group1 != -1 )
@@ -241,6 +248,14 @@ void HDF5Writer::writeBasis (int level, const DataEntry& entry,
241248
242249void HDF5Writer ::writeSIM (int level , const DataEntry & entry ,
243250 bool geometryUpdated , const std ::string & prefix )
251+ {
252+ this -> writeSIMInt (level , entry , geometryUpdated , prefix , false);
253+ }
254+
255+
256+ void HDF5Writer ::writeSIMInt (int level , const DataEntry & entry ,
257+ bool geometryUpdated ,
258+ const std ::string & prefix , bool noData )
244259{
245260 if (!entry .second .enabled || !entry .second .data || entry .second .data2 .empty ())
246261 return ;
@@ -336,7 +351,7 @@ void HDF5Writer::writeSIM (int level, const DataEntry& entry,
336351 (!(results & DataExporter ::REDUNDANT ) || sim -> getGlobalProcessID () == 0 )) // we own the patch
337352 {
338353 ASMbase * pch = sim -> getPatch (loc );
339- if (results & DataExporter ::PRIMARY && !sol -> empty ()) {
354+ if (results & DataExporter ::PRIMARY && !sol -> empty () && ! noData ) {
340355 Vector psol ;
341356 size_t ndof1 = sim -> extractPatchSolution (* sol ,psol ,pch ,entry .second .ncmps ,
342357 usedescription ? 1 : 0 );
@@ -357,7 +372,7 @@ void HDF5Writer::writeSIM (int level, const DataEntry& entry,
357372 i + 1 , ndof1 , data , H5T_NATIVE_DOUBLE );
358373 }
359374
360- if (results & DataExporter ::SECONDARY && !sol -> empty ()) {
375+ if (results & DataExporter ::SECONDARY && !sol -> empty () && ! noData ) {
361376 Matrix field ;
362377 SIM ::SolutionMode mode = prob -> getMode ();
363378 const_cast < SIMbase * > (sim )-> setMode (SIM ::RECOVERY );
@@ -369,7 +384,7 @@ void HDF5Writer::writeSIM (int level, const DataEntry& entry,
369384 i + 1 , field .cols (), field .getRow (j + 1 ).ptr (), H5T_NATIVE_DOUBLE );
370385 }
371386
372- if (proj )
387+ if (proj && ! noData )
373388 for (size_t p = 0 ; p < proj -> size (); ++ p ) {
374389 if (proj -> at (p ).empty ())
375390 continue ;
@@ -394,7 +409,7 @@ void HDF5Writer::writeSIM (int level, const DataEntry& entry,
394409 i + 1 , field .cols (), field .getRow (j + 1 ).ptr (), H5T_NATIVE_DOUBLE );
395410 }
396411
397- if (results & DataExporter ::NORMS && eNorm ) {
412+ if (results & DataExporter ::NORMS && eNorm && ! noData ) {
398413 Matrix patchEnorm ;
399414 sim -> extractPatchElmRes (* eNorm ,patchEnorm ,loc - 1 );
400415 for (size_t j = 1 , l = 1 ; l < eNorm -> rows (); j ++ )
@@ -405,7 +420,7 @@ void HDF5Writer::writeSIM (int level, const DataEntry& entry,
405420 i + 1 , patchEnorm .cols (), patchEnorm .getRow (l ++ ).ptr (), H5T_NATIVE_DOUBLE );
406421 }
407422
408- if (results & DataExporter ::EIGENMODES ) {
423+ if (results & DataExporter ::EIGENMODES && ! noData ) {
409424 size_t iMode = 0 ;
410425 const std ::vector < Mode > * modes = static_cast < const std ::vector < Mode > * > (entry .second .data2 .front ());
411426 for (const Mode & mode : * modes )
@@ -440,7 +455,7 @@ void HDF5Writer::writeSIM (int level, const DataEntry& entry,
440455 else // must write empty dummy records for the other patches
441456 {
442457 double dummy = 0.0 ;
443- if (results & DataExporter ::PRIMARY ) {
458+ if (results & DataExporter ::PRIMARY && ! noData ) {
444459 if (usedescription )
445460 writeArray (group .front (), entry .second .description ,
446461 i + 1 , 0 , & dummy , H5T_NATIVE_DOUBLE );
@@ -453,18 +468,18 @@ void HDF5Writer::writeSIM (int level, const DataEntry& entry,
453468 i + 1 , 0 , & dummy , H5T_NATIVE_DOUBLE );
454469 }
455470
456- if (results & DataExporter ::SECONDARY )
471+ if (results & DataExporter ::SECONDARY && ! noData )
457472 for (size_t j = 0 ; j < prob -> getNoFields (2 ); j ++ )
458473 writeArray (group .front (), prefix + prob -> getField2Name (j ),
459474 i + 1 , 0 , & dummy ,H5T_NATIVE_DOUBLE );
460475
461- if (proj )
476+ if (proj && ! noData )
462477 for (size_t p = 0 ; p < proj -> size (); p ++ )
463478 for (size_t j = 0 ; j < prob -> getNoFields (2 ); j ++ )
464479 writeArray (group .front (), m_prefix [p ]+ " " + prob -> getField2Name (j ),
465480 i + 1 , 0 , & dummy ,H5T_NATIVE_DOUBLE );
466481
467- if (results & DataExporter ::NORMS && eNorm )
482+ if (results & DataExporter ::NORMS && eNorm && ! noData )
468483 for (size_t j = 1 ; j <= norm -> getNoFields (0 ); j ++ )
469484 for (size_t k = 1 ; k <= norm -> getNoFields (j ); k ++ )
470485 if (norm -> hasElementContributions (j ,k ))
0 commit comments