sandbox/huet/src/lagrangian_caps/post-processing-ft.h

    Post-processing functions for triangulated surfaces

    Output membrane position in plain text for external post-processing

    void dump_plain_nodes_pos(lagMesh* mesh, char* filename) {
      if (pid() == 0) {
        FILE* file = fopen(filename, "a");
        assert(file);
        fprintf(file, "%g", t);
        for(int i=0; i<mesh->nln; i++) {
          fprintf(file, ",%g %g %g", mesh->nodes[i].pos.x, mesh->nodes[i].pos.y,
          mesh->nodes[i].pos.z);
        }
        fprintf(file, "\n");
        fclose(file);
        }
    }
    
    void dump_plain_triangles(lagMesh* mesh, char* filename) {
      if (pid() == 0) {
        FILE* file = fopen(filename, "a");
        assert(file);
        fprintf(file, "%g", t);
        for(int i=0; i<mesh->nlt; i++) {
          fprintf(file, ",%d %d %d %g", mesh->triangles[i].node_ids[0],
          mesh->triangles[i].node_ids[1], mesh->triangles[i].node_ids[2],
          mesh->triangles[i].area);
        }
        fprintf(file, "\n");
        fclose(file);
      }
    }

    Visualization in paraview

    struct _pv_output_ascii {
      char* name;
      FILE* fp;
    };
    
    int pv_timestep = 0;
    void pv_output_ascii(struct _pv_output_ascii p) {
      if (pid() == 0) {
        char name[128];
        char default_name[5] = "caps\0";
        char* prefix = p.name ? p.name : default_name;
        char suffix[64];
        sprintf(suffix, "_T%d.vtk", pv_timestep);
        sprintf(name, "%s%s", prefix, suffix);
        FILE* file = p.fp ? p.fp : fopen(name, "w");
        assert(file);
    
        /* Populate the header and other non-data fields */
        fprintf(file, "# vtk DataFile Version 4.2\n");
        fprintf(file, "Capsules at time %g\n", t);
        fprintf(file, "ASCII\n");
        fprintf(file, "DATASET POLYDATA\n");

    First, we find the number of nodes and triangles to display

        int nbpts_tot = 0;
        int nbtri_tot = 0;
        for(int j=0; j<NCAPS; j++) {
          if (CAPS(j).isactive) {
            nbpts_tot += CAPS(j).nln;
            nbtri_tot += CAPS(j).nlt;
          }
        }
    
        /* Populate the coordinates of all the Lagrangian nodes */
        fprintf(file, "POINTS %d double\n", nbpts_tot);
        for(int j=0; j<NCAPS; j++) {
          for(int k=0; k<CAPS(j).nln; k++) {
            coord node_pos = correct_periodic_node_pos(
              CAPS(j).nodes[k].pos, CAPS(j).centroid);
            fprintf(file, "%g %g %g\n", node_pos.x, node_pos.y, node_pos.z);
          }
        }
    
        /* Populate the connectivity of the triangles */
        fprintf(file, "TRIANGLE_STRIPS %d %d\n", nbtri_tot, 
        4*nbtri_tot);
        int node_offset = 0;
        for(int j=0; j<NCAPS; j++) {
          for(int k=0; k<CAPS(j).nlt; k++) {
          fprintf(file, "%d %d %d %d\n", 3,
            CAPS(j).triangles[k].node_ids[0] + node_offset,
            CAPS(j).triangles[k].node_ids[1] + node_offset,
            CAPS(j).triangles[k].node_ids[2] + node_offset);
          }
          node_offset += CAPS(j).nln;
        }
        fprintf(file, "CELL_DATA %d\n", nbtri_tot);
        fprintf(file, "SCALARS T1 double 1 \n");
        fprintf(file, "LOOKUP_TABLE default\n");
        for(int j=0; j<NCAPS; j++) {  
          for(int k=0; k<CAPS(j).nlt; k++)
            fprintf(file, "%g ", CAPS(j).triangles[k].tension[0]);
        }
        fprintf(file, "\n");
        fprintf(file, "SCALARS T2 double 1 \n");
        fprintf(file, "LOOKUP_TABLE default\n");
        for(int j=0; j<NCAPS; j++) {
          for(int k=0; k<CAPS(j).nlt; k++)
            fprintf(file, "%g ", CAPS(j).triangles[k].tension[1]);
        }
        fprintf(file, "\n");
        fprintf(file, "SCALARS Tmax double 1 \n");
        fprintf(file, "LOOKUP_TABLE default\n");
        for(int j=0; j<NCAPS; j++) {
          for(int k=0; k<CAPS(j).nlt; k++)
            fprintf(file, "%g ", max(CAPS(j).triangles[k].tension[0], 
              CAPS(j).triangles[k].tension[1]));
        }
        fprintf(file, "\n");
        fprintf(file, "SCALARS Tavg double 1 \n");
        fprintf(file, "LOOKUP_TABLE default\n");
        for(int j=0; j<NCAPS; j++) {
          for(int k=0; k<CAPS(j).nlt; k++)
            fprintf(file, "%g ", .5*(CAPS(j).triangles[k].tension[0] + 
              CAPS(j).triangles[k].tension[1]));
        }
        fprintf(file, "\n");
        fprintf(file, "SCALARS Lambda_1 double 1 \n");
        fprintf(file, "LOOKUP_TABLE default\n");
        for(int j=0; j<NCAPS; j++) {
          for(int k=0; k<CAPS(j).nlt; k++)
            fprintf(file, "%g ", CAPS(j).triangles[k].stretch[0]);
        }
        fprintf(file, "\n");
        fprintf(file, "SCALARS Lambda_2 double 1 \n");
        fprintf(file, "LOOKUP_TABLE default\n");
        for(int j=0; j<NCAPS; j++) {
          for(int k=0; k<CAPS(j).nlt; k++)
            fprintf(file, "%g ", CAPS(j).triangles[k].stretch[1]);
        }
        fprintf(file, "\n");
        fclose(file);
      }
      pv_timestep++;
    }