diff options
| author | Magnus Lundborg <lundborg.magnus@gmail.com> | 2013-10-28 15:27:51 (GMT) | 
|---|---|---|
| committer | Magnus Lundborg <lundborg.magnus@gmail.com> | 2013-10-28 15:27:51 (GMT) | 
| commit | 5e2aa20f61229654d06111e6086ce8d417a7664b (patch) | |
| tree | b464a29f72fd1f4b5432eac87b70f48f2925dfb8 /src | |
| parent | e2131c7ee45d9b0aefc3f9304fd7851978cc4b51 (diff) | |
Added utility functions for writing double precision data.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/tng_io.c | 504 | 
1 files changed, 495 insertions, 9 deletions
| diff --git a/src/lib/tng_io.c b/src/lib/tng_io.c index 8bb8f43..e0e34c3 100644 --- a/src/lib/tng_io.c +++ b/src/lib/tng_io.c @@ -15053,6 +15053,124 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_write_interval_set      return(TNG_SUCCESS);  } +tng_function_status DECLSPECDLLEXPORT tng_util_generic_write_interval_double_set +                (tng_trajectory_t tng_data, +                 const int64_t i, +                 const int64_t n_values_per_frame, +                 const int64_t block_id, +                 const char *block_name, +                 const char particle_dependency, +                 const char compression) +{ +    tng_trajectory_frame_set_t frame_set; +    tng_particle_data_t p_data; +    tng_non_particle_data_t np_data; +    int64_t n_particles, n_frames = 100*i; +    tng_function_status stat; + +    stat = tng_check_trajectory_container(tng_data); +    if(stat != TNG_SUCCESS) +    { +        printf("Trajectory container not properly setup. %s: %d\n", +               __FILE__, __LINE__); +        return(stat); +    } + +    if(i <= 0) +    { +        printf("Cannot set writing frequency to %"PRId64". %s: %d\n", +               i, __FILE__, __LINE__); +        return(TNG_FAILURE); +    } + +    frame_set = &tng_data->current_trajectory_frame_set; + +    if(!frame_set || tng_data->n_trajectory_frame_sets <= 0) +    { +        stat = tng_frame_set_new(tng_data, 0, n_frames); +        if(stat != TNG_SUCCESS) +        { +            printf("Cannot create frame set.  %s: %d\n", __FILE__, +                __LINE__); +            return(stat); +        } +    } +    else +    { +        n_frames = frame_set->n_frames; +    } + +    if(particle_dependency == TNG_PARTICLE_BLOCK_DATA) +    { +        tng_num_particles_get(tng_data, &n_particles); + +        if(tng_particle_data_find(tng_data, block_id, &p_data) +        != TNG_SUCCESS) +        { +            stat = tng_particle_data_block_add(tng_data, block_id, +                                            block_name, +                                            TNG_DOUBLE_DATA, +                                            TNG_TRAJECTORY_BLOCK, +                                            n_frames, n_values_per_frame, i, +                                            0, n_particles, +                                            compression, 0); +            if(stat != TNG_SUCCESS) +            { +                printf("Error %s adding data block. %s: %d\n", block_name, +                       __FILE__, __LINE__); +                return(stat); +            } +            p_data = &frame_set->tr_particle_data[frame_set-> +                                                  n_particle_data_blocks - 1]; +            stat = tng_allocate_particle_data_mem(tng_data, p_data, n_frames, +                                                  i, n_particles, +                                                  n_values_per_frame); +            if(stat != TNG_SUCCESS) +            { +                printf("Error allocating particle data memory. %s: %d\n", +                       __FILE__, __LINE__); +                return(stat); +            } +        } +        else +        { +            p_data->stride_length = i; +        } +    } +    else +    { +        if(tng_data_find(tng_data, block_id, &np_data) != TNG_SUCCESS) +        { +            stat = tng_data_block_add(tng_data, block_id, block_name, +                                      TNG_DOUBLE_DATA, TNG_TRAJECTORY_BLOCK, +                                      n_frames, n_values_per_frame, +                                      i, compression, 0); +            if(stat != TNG_SUCCESS) +            { +                printf("Error %s adding data block. %s: %d\n", block_name, +                       __FILE__, __LINE__); +                return(stat); +            } +            np_data = &frame_set->tr_data[frame_set-> +                                          n_data_blocks - 1]; +            stat = tng_allocate_data_mem(tng_data, np_data, n_frames, +                                         i, n_values_per_frame); +            if(stat != TNG_SUCCESS) +            { +                printf("Error allocating particle data memory. %s: %d\n", +                       __FILE__, __LINE__); +                return(stat); +            } +        } +        else +        { +            np_data->stride_length = i; +        } +    } + +    return(TNG_SUCCESS); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_generic_write_frequency_set                  (tng_trajectory_t tng_data,                   const int64_t i, @@ -15062,7 +15180,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_write_frequency_set                   const char particle_dependency,                   const char compression)  { -    printf("Using obsolete function tng_util_generic_write_frequency_set()." +    printf("Using obsolete function tng_util_generic_write_frequency_set(). "             "See documentation. %s: %d", __FILE__, __LINE__);      return(tng_util_generic_write_interval_set(tng_data, i, n_values_per_frame,                                                 block_id, block_name, @@ -15080,11 +15198,22 @@ tng_function_status DECLSPECDLLEXPORT tng_util_pos_write_interval_set                                                 TNG_TNG_COMPRESSION));  } +tng_function_status DECLSPECDLLEXPORT tng_util_pos_write_interval_double_set +                (tng_trajectory_t tng_data, +                 const int64_t i) +{ +    return(tng_util_generic_write_interval_double_set(tng_data, i, 3, +                                                      TNG_TRAJ_POSITIONS, +                                                      "POSITIONS", +                                                      TNG_PARTICLE_BLOCK_DATA, +                                                      TNG_TNG_COMPRESSION)); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_pos_write_frequency_set                  (tng_trajectory_t tng_data,                   const int64_t i)  { -    printf("Using obsolete function tng_util_pos_write_frequency_set()." +    printf("Using obsolete function tng_util_pos_write_frequency_set(). "             "See documentation. %s: %d", __FILE__, __LINE__);      return(tng_util_pos_write_interval_set(tng_data, i));  } @@ -15100,11 +15229,22 @@ tng_function_status DECLSPECDLLEXPORT tng_util_vel_write_interval_set                                                 TNG_TNG_COMPRESSION));  } +tng_function_status DECLSPECDLLEXPORT tng_util_vel_write_interval_double_set +                (tng_trajectory_t tng_data, +                 const int64_t i) +{ +    return(tng_util_generic_write_interval_double_set(tng_data, i, 3, +                                                      TNG_TRAJ_VELOCITIES, +                                                      "VELOCITIES", +                                                      TNG_PARTICLE_BLOCK_DATA, +                                                      TNG_TNG_COMPRESSION)); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_vel_write_frequency_set                  (tng_trajectory_t tng_data,                   const int64_t i)  { -    printf("Using obsolete function tng_util_vel_write_frequency_set()." +    printf("Using obsolete function tng_util_vel_write_frequency_set(). "             "See documentation. %s: %d", __FILE__, __LINE__);      return(tng_util_vel_write_interval_set(tng_data, i));  } @@ -15120,11 +15260,22 @@ tng_function_status DECLSPECDLLEXPORT tng_util_force_write_interval_set                                                 TNG_GZIP_COMPRESSION));  } +tng_function_status DECLSPECDLLEXPORT tng_util_force_write_interval_double_set +                (tng_trajectory_t tng_data, +                 const int64_t i) +{ +    return(tng_util_generic_write_interval_double_set(tng_data, i, 3, +                                                      TNG_TRAJ_FORCES, +                                                      "FORCES", +                                                      TNG_PARTICLE_BLOCK_DATA, +                                                      TNG_GZIP_COMPRESSION)); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_force_write_frequency_set                  (tng_trajectory_t tng_data,                   const int64_t i)  { -    printf("Using obsolete function tng_util_force_write_frequency_set()." +    printf("Using obsolete function tng_util_force_write_frequency_set(). "             "See documentation. %s: %d", __FILE__, __LINE__);      return(tng_util_force_write_interval_set(tng_data, i));  } @@ -15134,17 +15285,28 @@ tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_write_interval_set                   const int64_t i)  {      return(tng_util_generic_write_interval_set(tng_data, i, 9, -                                                TNG_TRAJ_BOX_SHAPE, -                                                "BOX SHAPE", -                                                TNG_NON_PARTICLE_BLOCK_DATA, -                                                TNG_GZIP_COMPRESSION)); +                                               TNG_TRAJ_BOX_SHAPE, +                                               "BOX SHAPE", +                                               TNG_NON_PARTICLE_BLOCK_DATA, +                                               TNG_GZIP_COMPRESSION)); +} + +tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_write_interval_double_set +                (tng_trajectory_t tng_data, +                 const int64_t i) +{ +    return(tng_util_generic_write_interval_double_set(tng_data, i, 9, +                                                      TNG_TRAJ_BOX_SHAPE, +                                                      "BOX SHAPE", +                                                      TNG_NON_PARTICLE_BLOCK_DATA, +                                                      TNG_GZIP_COMPRESSION));  }  tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_write_frequency_set                  (tng_trajectory_t tng_data,                   const int64_t i)  { -    printf("Using obsolete function tng_util_box_shape_write_frequency_set()." +    printf("Using obsolete function tng_util_box_shape_write_frequency_set(). "             "See documentation. %s: %d", __FILE__, __LINE__);      return(tng_util_box_shape_write_interval_set(tng_data, i));  } @@ -15337,6 +15499,194 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_write      return(TNG_SUCCESS);  } +tng_function_status DECLSPECDLLEXPORT tng_util_generic_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double *values, +                 const int64_t n_values_per_frame, +                 const int64_t block_id, +                 const char *block_name, +                 const char particle_dependency, +                 const char compression) +{ +    tng_trajectory_frame_set_t frame_set; +    tng_particle_data_t p_data; +    tng_non_particle_data_t np_data; +    int64_t n_particles, n_frames = 10000, stride_length = 100, frame_pos; +    char block_type_flag; +    tng_function_status stat; + +    stat = tng_check_trajectory_container(tng_data); +    if(stat != TNG_SUCCESS) +    { +        printf("Trajectory container not properly setup. %s: %d\n", +               __FILE__, __LINE__); +        return(stat); +    } + +    if(values == 0) +    { +        return(TNG_FAILURE); +    } + +    frame_set = &tng_data->current_trajectory_frame_set; + +    if(frame_nr < 0) +    { +        block_type_flag = TNG_NON_TRAJECTORY_BLOCK; +        n_frames = stride_length = 1; +    } +    else +    { +        block_type_flag = TNG_TRAJECTORY_BLOCK; + +        if(!frame_set || tng_data->n_trajectory_frame_sets <= 0) +        { +            stat = tng_frame_set_new(tng_data, 0, n_frames); +            if(stat != TNG_SUCCESS) +            { +                printf("Cannot create frame set.  %s: %d\n", __FILE__, +                    __LINE__); +                return(stat); +            } +        } +        else +        { +            n_frames = frame_set->n_frames; +        } +        if(frame_nr >= frame_set->first_frame + n_frames) +        { +            stat = tng_frame_set_write(tng_data, TNG_USE_HASH); +            if(stat != TNG_SUCCESS) +            { +                printf("Cannot write frame set.  %s: %d\n", __FILE__, +                    __LINE__); +                return(stat); +            } +            stat = tng_frame_set_new(tng_data, frame_set->first_frame + +                                     frame_set->n_frames, n_frames); +            if(stat != TNG_SUCCESS) +            { +                printf("Cannot create frame set.  %s: %d\n", __FILE__, +                    __LINE__); +                return(stat); +            } +        } +        frame_set->n_unwritten_frames = frame_nr - +                                        frame_set->first_frame + 1; +    } + +    if(particle_dependency == TNG_PARTICLE_BLOCK_DATA) +    { +        tng_num_particles_get(tng_data, &n_particles); + +        if(tng_particle_data_find(tng_data, block_id, &p_data) +        != TNG_SUCCESS) +        { +            stat = tng_particle_data_block_add(tng_data, block_id, +                                            block_name, +                                            TNG_DOUBLE_DATA, +                                            block_type_flag, +                                            n_frames, n_values_per_frame, +                                            stride_length, +                                            0, n_particles, +                                            compression, 0); +            if(stat != TNG_SUCCESS) +            { +                printf("Error %s adding data block. %s: %d\n", block_name, +                       __FILE__, __LINE__); +                return(stat); +            } +            if(block_type_flag == TNG_TRAJECTORY_BLOCK) +            { +                p_data = &frame_set->tr_particle_data[frame_set-> +                                                    n_particle_data_blocks - 1]; +            } +            else +            { +                p_data = &tng_data->non_tr_particle_data[tng_data-> +                                                    n_particle_data_blocks - 1]; +            } +            stat = tng_allocate_particle_data_mem(tng_data, p_data, n_frames, +                                                  stride_length, n_particles, +                                                  n_values_per_frame); +            if(stat != TNG_SUCCESS) +            { +                printf("Error allocating particle data memory. %s: %d\n", +                       __FILE__, __LINE__); +                return(stat); +            } +        } + +        if(block_type_flag == TNG_TRAJECTORY_BLOCK) +        { +            stride_length = p_data->stride_length; + +            frame_pos = (frame_nr - frame_set->first_frame) / stride_length; + +            memcpy((char *)p_data->values + sizeof(float) * frame_pos * n_particles * +                   n_values_per_frame, values, sizeof(float) * +                   n_particles * n_values_per_frame); +        } +        else +        { +            memcpy(p_data->values, values, sizeof(float) * n_particles * +                   n_values_per_frame); +        } +    } +    else +    { +        if(tng_data_find(tng_data, block_id, &np_data) != TNG_SUCCESS) +        { +            stat = tng_data_block_add(tng_data, block_id, block_name, +                                      TNG_DOUBLE_DATA, block_type_flag, +                                      n_frames, n_values_per_frame, +                                      stride_length, compression, 0); +            if(stat != TNG_SUCCESS) +            { +                printf("Error %s adding data block. %s: %d\n", block_name, +                       __FILE__, __LINE__); +                return(stat); +            } +            if(block_type_flag == TNG_TRAJECTORY_BLOCK) +            { +                np_data = &frame_set->tr_data[frame_set-> +                                              n_data_blocks - 1]; +            } +            else +            { +                np_data = &tng_data->non_tr_data[tng_data-> +                                                 n_data_blocks - 1]; +            } +            stat = tng_allocate_data_mem(tng_data, np_data, n_frames, +                                         stride_length, n_values_per_frame); +            if(stat != TNG_SUCCESS) +            { +                printf("Error allocating particle data memory. %s: %d\n", +                       __FILE__, __LINE__); +                return(stat); +            } +        } + +        if(block_type_flag == TNG_TRAJECTORY_BLOCK) +        { +            stride_length = np_data->stride_length; + +            frame_pos = (frame_nr - frame_set->first_frame) / stride_length; + +            memcpy((char *)np_data->values + sizeof(float) * frame_pos * +                   n_values_per_frame, values, sizeof(float) * +                   n_values_per_frame); +        } +        else +        { +            memcpy(np_data->values, values, sizeof(float) * n_values_per_frame); +        } +    } + +    return(TNG_SUCCESS); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_pos_write                  (tng_trajectory_t tng_data,                   const int64_t frame_nr, @@ -15348,6 +15698,17 @@ tng_function_status DECLSPECDLLEXPORT tng_util_pos_write                                    TNG_TNG_COMPRESSION));  } +tng_function_status DECLSPECDLLEXPORT tng_util_pos_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double *positions) +{ +    return(tng_util_generic_double_write(tng_data, frame_nr, positions, 3, +                                         TNG_TRAJ_POSITIONS, "POSITIONS", +                                         TNG_PARTICLE_BLOCK_DATA, +                                         TNG_TNG_COMPRESSION)); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_vel_write                  (tng_trajectory_t tng_data,                   const int64_t frame_nr, @@ -15359,6 +15720,17 @@ tng_function_status DECLSPECDLLEXPORT tng_util_vel_write                                    TNG_TNG_COMPRESSION));  } +tng_function_status DECLSPECDLLEXPORT tng_util_vel_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double *velocities) +{ +    return(tng_util_generic_double_write(tng_data, frame_nr, velocities, 3, +                                         TNG_TRAJ_VELOCITIES, "VELOCITIES", +                                         TNG_PARTICLE_BLOCK_DATA, +                                         TNG_TNG_COMPRESSION)); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_force_write                  (tng_trajectory_t tng_data,                   const int64_t frame_nr, @@ -15370,6 +15742,17 @@ tng_function_status DECLSPECDLLEXPORT tng_util_force_write                                    TNG_GZIP_COMPRESSION));  } +tng_function_status DECLSPECDLLEXPORT tng_util_force_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double *forces) +{ +    return(tng_util_generic_double_write(tng_data, frame_nr, forces, 3, +                                         TNG_TRAJ_FORCES, "FORCES", +                                         TNG_PARTICLE_BLOCK_DATA, +                                         TNG_GZIP_COMPRESSION)); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_write                  (tng_trajectory_t tng_data,                   const int64_t frame_nr, @@ -15381,6 +15764,17 @@ tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_write                                    TNG_GZIP_COMPRESSION));  } +tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double *box_shape) +{ +    return(tng_util_generic_double_write(tng_data, frame_nr, box_shape, 9, +                                         TNG_TRAJ_BOX_SHAPE, "BOX SHAPE", +                                         TNG_NON_PARTICLE_BLOCK_DATA, +                                         TNG_GZIP_COMPRESSION)); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_pos_with_time_write                  (tng_trajectory_t tng_data,                   const int64_t frame_nr, @@ -15404,6 +15798,29 @@ tng_function_status DECLSPECDLLEXPORT tng_util_pos_with_time_write      return(stat);  } +tng_function_status DECLSPECDLLEXPORT tng_util_pos_with_time_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double time, +                 const double *positions) +{ +    tng_function_status stat; + +    stat = tng_util_generic_double_write(tng_data, frame_nr, positions, 3, +                                         TNG_TRAJ_POSITIONS, "POSITIONS", +                                         TNG_PARTICLE_BLOCK_DATA, +                                         TNG_TNG_COMPRESSION); +    if(stat != TNG_SUCCESS) +    { +        return(stat); +    } +    if(tng_data->current_trajectory_frame_set.first_frame == frame_nr) +    { +        stat = tng_frame_set_first_frame_time_set(tng_data, time); +    } +    return(stat); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_vel_with_time_write                  (tng_trajectory_t tng_data,                   const int64_t frame_nr, @@ -15427,6 +15844,29 @@ tng_function_status DECLSPECDLLEXPORT tng_util_vel_with_time_write      return(stat);  } +tng_function_status DECLSPECDLLEXPORT tng_util_vel_with_time_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double time, +                 const double *velocities) +{ +    tng_function_status stat; + +    stat = tng_util_generic_double_write(tng_data, frame_nr, velocities, 3, +                                         TNG_TRAJ_VELOCITIES, "VELOCITIES", +                                         TNG_PARTICLE_BLOCK_DATA, +                                         TNG_TNG_COMPRESSION); +    if(stat != TNG_SUCCESS) +    { +        return(stat); +    } +    if(tng_data->current_trajectory_frame_set.first_frame == frame_nr) +    { +        stat = tng_frame_set_first_frame_time_set(tng_data, time); +    } +    return(stat); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_force_with_time_write                  (tng_trajectory_t tng_data,                   const int64_t frame_nr, @@ -15450,6 +15890,29 @@ tng_function_status DECLSPECDLLEXPORT tng_util_force_with_time_write      return(stat);  } +tng_function_status DECLSPECDLLEXPORT tng_util_force_with_time_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double time, +                 const double *forces) +{ +    tng_function_status stat; + +    stat = tng_util_generic_double_write(tng_data, frame_nr, forces, 3, +                                         TNG_TRAJ_FORCES, "FORCES", +                                         TNG_PARTICLE_BLOCK_DATA, +                                         TNG_GZIP_COMPRESSION); +    if(stat != TNG_SUCCESS) +    { +        return(stat); +    } +    if(tng_data->current_trajectory_frame_set.first_frame == frame_nr) +    { +        stat = tng_frame_set_first_frame_time_set(tng_data, time); +    } +    return(stat); +} +  tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_with_time_write                  (tng_trajectory_t tng_data,                   const int64_t frame_nr, @@ -15473,3 +15936,26 @@ tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_with_time_write      return(stat);  } +tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_with_time_double_write +                (tng_trajectory_t tng_data, +                 const int64_t frame_nr, +                 const double time, +                 const double *box_shape) +{ +    tng_function_status stat; + +    stat = tng_util_generic_double_write(tng_data, frame_nr, box_shape, 9, +                                         TNG_TRAJ_BOX_SHAPE, "BOX SHAPE", +                                         TNG_NON_PARTICLE_BLOCK_DATA, +                                         TNG_GZIP_COMPRESSION); +    if(stat != TNG_SUCCESS) +    { +        return(stat); +    } +    if(tng_data->current_trajectory_frame_set.first_frame == frame_nr) +    { +        stat = tng_frame_set_first_frame_time_set(tng_data, time); +    } +    return(stat); +} + | 
