Example #1
0
void DumpMeshVTK::pack(int *ids)
{
  int m = 0;
  double node[3];
  TriMesh *mesh;
  ScalarContainer<double> *cb1;
  VectorContainer<double,3> *cb2;

  double **tmp;
  memory->create<double>(tmp,3,3,"DumpMeshVTK:tmp");

  // have to stick with this order (all per-element props)
  // as multiple procs pack
  for(int iMesh = 0;iMesh < nMesh_; iMesh++)
  {
    mesh = meshList_[iMesh];

    if(!mesh->isParallel() && 0 != comm->me)
        continue;

    int nlocal = meshList_[iMesh]->sizeLocal();

    for(int iTri = 0; iTri < nlocal; iTri++)
    {
        for(int j=0;j<3;j++)
        {
            mesh->node(iTri,j,node);
            for(int k=0;k<3;k++)
                buf[m++] = node[k];
        }

        if(dump_what_ & DUMP_STRESS)
        {
            buf[m++] = sigma_n_[iMesh] ? sigma_n_[iMesh]->get(iTri) : 0.;
            buf[m++] = sigma_t_[iMesh] ? sigma_t_[iMesh]->get(iTri) : 0.;
        }

        if(dump_what_ & DUMP_STRESSCOMPONENTS)
        {
            double invArea = 1./mesh->areaElem(iTri);
            double f[3];
            if(f_node_[iMesh])
                f_node_[iMesh]->get(iTri,f);
            else
                vectorZeroize3D(f);
            buf[m++] = f[0]*invArea;
            buf[m++] = f[1]*invArea;
            buf[m++] = f[2]*invArea;
        }

        if(dump_what_ & DUMP_ID)
        {
            buf[m++] = static_cast<double>(mesh->id(iTri));
        }

        if(dump_what_ & DUMP_VEL)
        {
            double avg[3];

            if(v_node_[iMesh])
            {
                // get vel for element, copy it to tmp
                v_node_[iMesh]->get(iTri,tmp);

                // calculate average
                vectorZeroize3D(avg);
                vectorCopy3D(tmp[0],avg);
                vectorAdd3D(tmp[1],avg,avg);
                vectorAdd3D(tmp[2],avg,avg);
                vectorScalarDiv3D(avg,3.);
            }
            else
                vectorZeroize3D(avg);

            // push to buffer
            buf[m++] = avg[0];
            buf[m++] = avg[1];
            buf[m++] = avg[2];
        }

        if(dump_what_ & DUMP_WEAR)
        {
            buf[m++] = wear_[iMesh] ? wear_[iMesh]->get(iTri) : 0.;
        }

        if(dump_what_ & DUMP_TEMP)
        {
            buf[m++] = (temp_per_element_[iMesh]) ? (T_[iMesh]->get(iTri)) : (T_[iMesh] ? T_[iMesh]->get(0) : 0.);
        }

        if(dump_what_ & DUMP_OWNER)
        {
            int me = comm->me;
            buf[m++] = static_cast<double>(me);
        }

        if(dump_what_ & DUMP_AREA)
        {
            buf[m++] = mesh->areaElem(iTri);
        }

        if(dump_what_ & DUMP_AEDGES)
        {
            buf[m++] = static_cast<double>(mesh->n_active_edges(iTri));
        }

        if(dump_what_ & DUMP_ACORNERS)
        {
            buf[m++] = static_cast<double>(mesh->n_active_corners(iTri));
        }
        if(dump_what_ & DUMP_INDEX)
        {
            buf[m++] = static_cast<double>(iTri);
        }
        if(dump_what_ & DUMP_NNEIGHS)
        {
            buf[m++] = static_cast<double>(mesh->nNeighs(iTri));
        }
        if(dump_what_ & DUMP_MIN_ACTIVE_EDGE_DIST)
        {
            buf[m++] = min_active_edge_dist_[iMesh] ? min_active_edge_dist_[iMesh]->get(iTri) : 0.;
        }

        for(int ib = 0; ib < n_scalar_containers_; ib++)
        {
           cb1 = scalar_containers_[ib][iMesh];
           buf[m++] = cb1 ? (*cb1)(iTri) : 0.;
        }

        for(int ib = 0; ib < n_vector_containers_; ib++)
        {
           cb2 = vector_containers_[ib][iMesh];
           buf[m++] = cb2 ? (*cb2)(iTri)[0] : 0.;
           buf[m++] = cb2 ? (*cb2)(iTri)[1] : 0.;
           buf[m++] = cb2 ? (*cb2)(iTri)[2] : 0.;
        }
    }
  }

  memory->destroy<double>(tmp);

  return;
}