sandbox/acastillo/output_fields/vtu/output_vtu_helpers_data.h

    #ifndef OUTPUT_VTU_HELPERS_DATA_H
    #define OUTPUT_VTU_HELPERS_DATA_H
    
    /** ## Functions to write heavy data */
    /** ### Write scalar field data */
    void write_scalar_heavy_data(FILE *fp, scalar *list, scalar per_mask, long no_cells){
      long block_len = no_cells * sizeof(double);
      for (scalar s in list){
        fwrite(&block_len, sizeof(long), 1, fp);
        foreach (){
          if (per_mask[]){
            fwrite(&val(s), sizeof(double), 1, fp);
          }
        }
      }
    }
    
    void write_scalar_heavy_data_slice(FILE *fp, scalar *list, scalar per_mask, long no_cells, coord n = {0, 0, 1}, double _alpha = 0){
      long block_len = no_cells * sizeof(double);
      for (scalar s in list){
        fwrite(&block_len, sizeof(long), 1, fp);
        foreach (){
          if (per_mask[]){
            double sval;
            if (n.x == 1)
              sval = 0.5 * (val(s) + val(s, 1, 0, 0));
            else if (n.y == 1)
              sval = 0.5 * (val(s) + val(s, 0, 1, 0));
            else
              sval = 0.5 * (val(s) + val(s, 0, 0, 1));
            fwrite(&sval, sizeof(double), 1, fp);
          }
        }
      }
    }
    
    void write_scalar_heavy_data_array(FILE *fp, long no_cells, double *pt_array_s){
      long block_len = no_cells * sizeof(double);
      fwrite(&block_len, sizeof(long), 1, fp);
      for (int i = 0; i < no_cells; i++){
        fwrite(&pt_array_s[i], sizeof(double), 1, fp);
      }
    }
    
    /** ### Write vector field data */
    void write_vector_heavy_data(FILE *fp, vector *vlist, scalar per_mask, long no_cells){
      long block_len = no_cells * 3 * sizeof(double);
      for (vector v in vlist){
        fwrite(&block_len, sizeof(long), 1, fp);
        foreach (){
          if (per_mask[]){
            fwrite(&val(v.x), sizeof(double), 1, fp);
            fwrite(&val(v.y), sizeof(double), 1, fp);
            #if dimension == 2
              double vz = 0;
              fwrite(&vz, sizeof(double), 1, fp);
            #elif dimension == 3
              fwrite(&val(v.z), sizeof(double), 1, fp);
            #endif
          }
        }
      }
    }
    
    void write_vector_heavy_data_slice(FILE *fp, vector *vlist, scalar per_mask, long no_cells, coord n = {0, 0, 1}, double _alpha = 0){
      long block_len = no_cells * 3 * sizeof(double);
      for (vector v in vlist){
        fwrite(&block_len, sizeof(long), 1, fp);
        foreach (){
          if (per_mask[]){
            double xval, yval, zval;
            if (n.x == 1){
              xval = 0.5 * (val(v.x) + val(v.x, 1, 0, 0));
              yval = 0.5 * (val(v.y) + val(v.y, 1, 0, 0));
              #if dimension == 3
                zval = 0.5 * (val(v.z) + val(v.z, 1, 0, 0));
              #else
                zval = 0;
              #endif
            }
            else if (n.y == 1){
              xval = 0.5 * (val(v.x) + val(v.x, 0, 1, 0));
              yval = 0.5 * (val(v.y) + val(v.y, 0, 1, 0));
              #if dimension == 3
                zval = 0.5 * (val(v.z) + val(v.z, 0, 1, 0));
              #else
                zval = 0;
              #endif
            }
            else {
              xval = 0.5 * (val(v.x) + val(v.x, 0, 0, 1));
              yval = 0.5 * (val(v.y) + val(v.y, 0, 0, 1));
              #if dimension == 3
                zval = 0.5 * (val(v.z) + val(v.z, 0, 0, 1));
              #else
                zval = 0;
              #endif
            }
            fwrite(&xval, sizeof(double), 1, fp);
            fwrite(&yval, sizeof(double), 1, fp);
            fwrite(&zval, sizeof(double), 1, fp);
          }
        }
      }
    }
    
    /** ### Write points data */
    void write_points_heavy_data(FILE *fp, long no_points) {
      long block_len = no_points * 3 * sizeof(double);
      fwrite(&block_len, sizeof(long), 1, fp);
      foreach_vertex(){
        fwrite(&x, sizeof(double), 1, fp);
        fwrite(&y, sizeof(double), 1, fp);
        fwrite(&z, sizeof(double), 1, fp);
      }
    }
    
    void write_points_heavy_data_masked(FILE *fp, long no_points, vertex scalar mask) {
      long block_len = no_points * 3 * sizeof(double);
      fwrite(&block_len, sizeof(long), 1, fp);
      foreach_vertex(){
        if (mask[] >= 0.5){
          fwrite(&x, sizeof(double), 1, fp);
          fwrite(&y, sizeof(double), 1, fp);
          fwrite(&z, sizeof(double), 1, fp);
        }
      }
    }
    
    void write_points_heavy_data_slice(FILE *fp, long no_points, coord n = {0,0,1}, double _alpha = 0) {
      long block_len = no_points * 3 * sizeof(double);
      fwrite(&block_len, sizeof(long), 1, fp);
      foreach_vertex(){
        shortcut_slice(n, _alpha);
        fwrite(&x, sizeof(double), 1, fp);
        fwrite(&y, sizeof(double), 1, fp);
        fwrite(&z, sizeof(double), 1, fp);
      }
    }
    
    void write_points_heavy_data_array(FILE *fp, long no_points, double *pt_array_x, double *pt_array_y, double *pt_array_z) {
      long block_len = no_points * 3 * sizeof(double);
      fwrite(&block_len, sizeof(long), 1, fp);
      for (int i = 0; i < no_points; i++){
        fwrite(&pt_array_x[i], sizeof(double), 1, fp);
        fwrite(&pt_array_y[i], sizeof(double), 1, fp);
        #if dimension == 2
          double vz = 0;
          fwrite(&vz, sizeof(double), 1, fp);
        #elif dimension == 3
          fwrite(&pt_array_z[i], sizeof(double), 1, fp);
        #endif
      }
    }
    
    /** ### Write cell offsets */
    void write_cell_offsets(FILE *fp, long no_cells, char noffset) {
      long block_len = no_cells * sizeof(long);
      fwrite(&block_len, sizeof(long), 1, fp);
      for (int i = 0; i < no_cells; i++){
        long offset = (i + 1) * noffset;
        fwrite(&offset, sizeof(int64_t), 1, fp);
      }
    }
    
    void write_cell_offsets2(FILE *fp, long nfacets, long *offsets) {
      long block_len = nfacets * sizeof(long);
      fwrite(&block_len, sizeof(long), 1, fp);
      for (int ii = 0; ii < nfacets; ii++)
        fwrite(&offsets[ii], sizeof(long), 1, fp);
    }
    
    void write_cell_offsets3(FILE *fp, long no_cells) {
      long block_len = no_cells * sizeof(long);
      fwrite(&block_len, sizeof(long), 1, fp);
      for (long i = 0; i < no_cells; i++){
        fwrite(&i, sizeof(int64_t), 1, fp);
      }
    }
    
    /** ### Write cell types */
    void write_cell_types(FILE *fp, long no_cells, char type) {
      long block_len = no_cells * sizeof(char);
      fwrite(&block_len, sizeof(long), 1, fp);
      for (int i = 0; i < no_cells; i++){
        fwrite(&type, sizeof(char), 1, fp);
      }
    }
    
    /** ### Write cell connectivity */
    void write_cell_connectivity(FILE *fp, vertex scalar marker, scalar per_mask, long no_cells, char noffset) {
      long block_len = no_cells * noffset * sizeof(long);
      fwrite(&block_len, sizeof(long), 1, fp);
      foreach (serial, noauto){
        if (per_mask[]){
          long connectivity[noffset];
          connectivity[0] = (long)marker[];
          connectivity[1] = (long)marker[1];
          connectivity[2] = (long)marker[1, 1];
          connectivity[3] = (long)marker[0, 1];
    #if dimension == 3
          connectivity[4] = (long)marker[0, 0, 1];
          connectivity[5] = (long)marker[1, 0, 1];
          connectivity[6] = (long)marker[1, 1, 1];
          connectivity[7] = (long)marker[0, 1, 1];
    #endif
          fwrite(connectivity, sizeof(long), noffset, fp);
        }
      }
    }
    
    void write_cell_connectivity_slice(FILE *fp, vertex scalar marker, scalar per_mask, long no_cells, char noffset, coord n = {0,0,1} ) {
      long block_len = no_cells * noffset * sizeof(long);
      fwrite(&block_len, sizeof(long), 1, fp);
      foreach (serial, noauto){
        if (per_mask[]){
          long connectivity[noffset];
          if (n.x == 1){
            connectivity[0] = (long)marker[1, 0, 0];
            connectivity[1] = (long)marker[1, 1, 0];
            connectivity[2] = (long)marker[1, 1, 1];
            connectivity[3] = (long)marker[1, 0, 1];
          }
          else if (n.y == 1){
            connectivity[0] = (long)marker[0, 1, 0];
            connectivity[1] = (long)marker[1, 1, 0];
            connectivity[2] = (long)marker[1, 1, 1];
            connectivity[3] = (long)marker[0, 1, 1];
          }
          else{
            connectivity[0] = (long)marker[0, 0, 1];
            connectivity[1] = (long)marker[1, 0, 1];
            connectivity[2] = (long)marker[1, 1, 1];
            connectivity[3] = (long)marker[0, 1, 1];
          }
          fwrite(connectivity, sizeof(long), noffset, fp);
        }
      }
    }
    
    #endif