@@ -553,46 +553,115 @@ adios2_variable* spio_define_adios2_variable(iosystem_desc_t *ios, file_desc_t *
553553#ifdef _SPIO_ADIOS_USE_COMPRESSION
554554 assert (ios != NULL && file != NULL );
555555 /* Skip compression for scalar variables (ndims == 0), see https://github.com/ornladios/ADIOS2/issues/4390 */
556- if (variable != NULL && ios-> compression_operator != NULL && ndims > 0 && (file->iotype == PIO_IOTYPE_ADIOSC))
556+ if (variable != NULL && ndims > 0 && (file->iotype == PIO_IOTYPE_ADIOSC))
557557 {
558558 size_t operation_index = 0 ;
559559 adios2_error adiosErr = adios2_error_none;
560560
561- #if defined(ADIOS2_HAVE_BLOSC2)
562- /* Add a compression operation (Blosc2) to this variable */
563- adiosErr = adios2_add_operation (&operation_index, variable, ios->compression_operator , " compressor" , " zstd" ); /* Compressor type (e.g., zstd) */
564- if (adiosErr != adios2_error_none)
561+ /* Use lossless compression method by default */
562+ int variable_compression_method = ios->adios_lossless_compression_method ;
563+
564+ #ifdef _SPIO_ADIOS_USE_LOSSY_COMPRESSION
565+ /* Switch to lossy compression method */
566+ variable_compression_method = ios->adios_lossy_compression_method ;
567+
568+ /* SZ or MGARD compressor only supports float or double types */
569+ if (variable_compression_method == ADIOS_COMPRESSION_METHOD_SZ || variable_compression_method == ADIOS_COMPRESSION_METHOD_MGARD)
565570 {
566- pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
567- " Failed to add Blosc2 compression operation (compressor=zstd) to variable %s (adios2_error=%s) " ,
568- name, convert_adios2_error_to_string (adiosErr)) ;
571+ /* Switch back to lossless compression method for non floating point type */
572+ if (type != adios2_type_float && type != adios2_type_double)
573+ variable_compression_method = ios-> adios_lossless_compression_method ;
569574 }
575+ #endif
570576
571- /* Compression level is an integer between 0 (no compression) and 9 (more compression, more memory consumption) inclusive */
572- adiosErr = adios2_set_operation_parameter (variable, operation_index, " clevel" , " 5" );
573- if (adiosErr != adios2_error_none)
577+ if (variable_compression_method == ADIOS_COMPRESSION_METHOD_BLOSC2)
574578 {
575- pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
576- " Failed to set Blosc2 compression level (clevel=5) for variable %s (adios2_error=%s)" ,
577- name, convert_adios2_error_to_string (adiosErr));
578- }
579+ if (ios->lossless_compression_operator != NULL )
580+ {
581+ /* Add a compression operation (Blosc2) to this variable */
582+ adiosErr = adios2_add_operation (&operation_index, variable, ios->lossless_compression_operator , " compressor" , " zstd" ); /* Compressor type (e.g., zstd) */
583+ if (adiosErr != adios2_error_none)
584+ {
585+ pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
586+ " Failed to add Blosc2 compression operation (compressor=zstd) to variable %s (adios2_error=%s)" ,
587+ name, convert_adios2_error_to_string (adiosErr));
588+ }
579589
580- /* Shuffle option (BLOSC_SHUFFLE/BLOSC_NOSHUFFLE/BLOSC_BITSHUFFLE) */
581- adiosErr = adios2_set_operation_parameter (variable, operation_index, " doshuffle" , " BLOSC_BITSHUFFLE" );
582- if (adiosErr != adios2_error_none)
590+ /* Compression level is an integer between 0 (no compression) and 9 (more compression, more memory consumption) inclusive */
591+ adiosErr = adios2_set_operation_parameter (variable, operation_index, " clevel" , " 1" );
592+ if (adiosErr != adios2_error_none)
593+ {
594+ pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
595+ " Failed to set Blosc2 compression level (clevel=5) for variable %s (adios2_error=%s)" ,
596+ name, convert_adios2_error_to_string (adiosErr));
597+ }
598+
599+ /* Shuffle option (BLOSC_SHUFFLE/BLOSC_NOSHUFFLE/BLOSC_BITSHUFFLE) */
600+ adiosErr = adios2_set_operation_parameter (variable, operation_index, " doshuffle" , " BLOSC_BITSHUFFLE" );
601+ if (adiosErr != adios2_error_none)
602+ {
603+ pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
604+ " Failed to set Blosc2 shuffle (doshuffle=BLOSC_BITSHUFFLE) for variable %s (adios2_error=%s)" ,
605+ name, convert_adios2_error_to_string (adiosErr));
606+ }
607+ }
608+ }
609+ else if (variable_compression_method == ADIOS_COMPRESSION_METHOD_BZIP2)
583610 {
584- pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
585- " Failed to set Blosc2 shuffle (doshuffle=BLOSC_BITSHUFFLE) for variable %s (adios2_error=%s)" ,
586- name, convert_adios2_error_to_string (adiosErr));
611+ if (ios->lossless_compression_operator != NULL )
612+ {
613+ /* Add a compression operation (BZip2) to this variable */
614+ adiosErr = adios2_add_operation (&operation_index, variable, ios->lossless_compression_operator , " " , " " );
615+ if (adiosErr != adios2_error_none)
616+ {
617+ pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
618+ " Failed to add BZip2 compression operation to variable %s (adios2_error=%s)" ,
619+ name, convert_adios2_error_to_string (adiosErr));
620+ }
621+ }
587622 }
588- #elif defined(ADIOS2_HAVE_BZIP2)
589- /* Add a compression operation (BZip2) to this variable */
590- adiosErr = adios2_add_operation (&operation_index, variable, ios->compression_operator , " " , " " );
591- if (adiosErr != adios2_error_none)
623+ #ifdef _SPIO_ADIOS_USE_LOSSY_COMPRESSION
624+ else if (variable_compression_method == ADIOS_COMPRESSION_METHOD_MGARD)
625+ {
626+ if (ios->lossy_compression_operator != NULL )
627+ {
628+ /* Add a lossy compression operation (MGARD) to this variable */
629+ adiosErr = adios2_add_operation (&operation_index, variable, ios->lossy_compression_operator , " accuracy" , " 0.001" );
630+ if (adiosErr != adios2_error_none)
631+ {
632+ pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
633+ " Failed to add MGARD compression operation to variable %s (adios2_error=%s)" ,
634+ name, convert_adios2_error_to_string (adiosErr));
635+ }
636+ }
637+ }
638+ else if (variable_compression_method == ADIOS_COMPRESSION_METHOD_SZ)
639+ {
640+ if (ios->lossy_compression_operator != NULL )
641+ {
642+ /* Add a lossy compression operation (SZ) to this variable */
643+ adiosErr = adios2_add_operation (&operation_index, variable, ios->lossy_compression_operator , " accuracy" , " 0.001" );
644+ if (adiosErr != adios2_error_none)
645+ {
646+ pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
647+ " Failed to add SZ compression operation to variable %s (adios2_error=%s)" ,
648+ name, convert_adios2_error_to_string (adiosErr));
649+ }
650+ }
651+ }
652+ else if (variable_compression_method == ADIOS_COMPRESSION_METHOD_ZFP)
592653 {
593- pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
594- " Failed to add BZip2 compression operation to variable %s (adios2_error=%s)" ,
595- name, convert_adios2_error_to_string (adiosErr));
654+ if (ios->lossy_compression_operator != NULL )
655+ {
656+ /* Add a lossy compression operation (ZFP) to this variable */
657+ adiosErr = adios2_add_operation (&operation_index, variable, ios->lossy_compression_operator , " accuracy" , " 0.001" );
658+ if (adiosErr != adios2_error_none)
659+ {
660+ pio_err (ios, file, PIO_EADIOS2ERR, __FILE__, __LINE__,
661+ " Failed to add ZFP compression operation to variable %s (adios2_error=%s)" ,
662+ name, convert_adios2_error_to_string (adiosErr));
663+ }
664+ }
596665 }
597666 #endif
598667 }
0 commit comments