/* vim: set ts=4 sts=4 sw=4 noet : */ #include #include "general.h" #include #include "initial_distribution.h" #include "vesicle.h" #include "dumpstate.h" #include #include #include "vertex.h" #include "energy.h" ts_vesicle *vtk2vesicle(char *filename, ts_tape *tape){ ts_uint nshell=tape->nshell; ts_uint ncmax1=tape->ncxmax; ts_uint ncmax2=tape->ncymax; ts_uint ncmax3=tape->nczmax; ts_double stepsize=tape->stepsize; ts_uint no_vertices=5*nshell*nshell+2; ts_vesicle *vesicle=init_vesicle(no_vertices,ncmax1,ncmax2,ncmax3,stepsize); vesicle->nshell=nshell; parse_vtk(filename, vesicle); exit(1); return vesicle; } ts_bool parse_vtk(char *filename, ts_vesicle *vesicle){ xmlDoc *doc; xmlNode *root_element=NULL; xmlNode *cur_node = NULL; doc = xmlReadFile(filename, NULL, 0); root_element=xmlDocGetRootElement(doc); cur_node=root_element->children; while(cur_node!=NULL){ // fprintf(stderr,"Node name is: %s\n",cur_node->name); if(strcmp((char *)cur_node->name,"UnstructuredGrid")==0) break; cur_node=cur_node->next; } cur_node=cur_node->children; while(cur_node!=NULL){ // fprintf(stderr,"Node name is: %s\n",cur_node->name); cur_node=cur_node->next; if(strcmp((char *)cur_node->name,"Piece")==0) break; } cur_node=cur_node->children; while(cur_node!=NULL){ //fprintf(stderr,"Node name is: %s\n",cur_node->name); cur_node=cur_node->next; if(strcmp((char *)cur_node->name,"PointData")==0) vtk_index2vesicle(cur_node->children->next->children, vesicle); if(strcmp((char *)cur_node->name,"Points")==0) vtk_coordinates(cur_node->children->next->children,vesicle); if(strcmp((char *)cur_node->name,"Cells")==0) { vtk_neighbours(cur_node->children->next->children,vesicle); break; //segfaults, because it finds another cells. Why? } } //we have vertices and neighbour relations all set, but unordered. Let's do bonds, ordering, triangles... vesicle->vlist = vtk_sort_neighbours(vesicle->blist,vesicle->vlist); init_triangles(vesicle); init_triangle_neighbours(vesicle); init_common_vertex_triangle_neighbours(vesicle); init_normal_vectors(vesicle->tlist); mean_curvature_and_energy(vesicle); ts_fprintf(stdout,"restoring from vtk dump finished!\n"); return TS_SUCCESS; } ts_bool vtk_index2vesicle(xmlNode *node, ts_vesicle *vesicle){ //fprintf(stderr, "vsebina: %s\n",node->content); ts_uint i; char *token; token = strtok((char *)node->content, " "); for(i=0;ivlist->n;i++){ vesicle->vlist->vtx[i]->idx=atoi(token); token=strtok(NULL," "); } //fprintf(stderr,"idx[11]=%d\n",vesicle->vlist->vtx[11]->idx); return TS_SUCCESS; } ts_bool vtk_coordinates(xmlNode *node, ts_vesicle *vesicle){ //fprintf(stderr, "vsebina: %s\n",node->content); ts_uint i; char *token; token = strtok((char *)node->content, " "); for(i=0;ivlist->n;i++){ vesicle->vlist->vtx[i]->x=atof(token); // fprintf(stderr,"%e, ",atof(token)); token=strtok(NULL," "); vesicle->vlist->vtx[i]->y=atof(token); token=strtok(NULL,"\n"); vesicle->vlist->vtx[i]->z=atof(token); if(i>0) token=strtok(NULL," "); } return TS_SUCCESS; } ts_bool vtk_neighbours(xmlNode *node, ts_vesicle *vesicle){ // fprintf(stderr, "vsebina: %s\n",node->content); ts_uint i; ts_uint idx1, idx2; char *token; token = strtok((char *)node->content, " "); for(i=0;i<3*(vesicle->vlist->n-2);i++){ idx1=atoi(token); token=strtok(NULL,"\n"); idx2=atoi(token); vtx_add_neighbour(vesicle->vlist->vtx[idx1], vesicle->vlist->vtx[idx2]); vtx_add_neighbour(vesicle->vlist->vtx[idx2], vesicle->vlist->vtx[idx1]); fprintf(stderr, "%d. povezujem %d in %d\n",i,idx1,idx2); if(i>0) token=strtok(NULL," "); } return TS_SUCCESS; } /* this is almost exact copy of init_sort_neighbours */ ts_vertex_list *vtk_sort_neighbours(ts_bond_list *blist,ts_vertex_list *vlist){ ts_vertex **vtx=vlist->vtx -1; // take a look at dipyramid function for comment. ts_uint i,l,j,jj,jjj,k=0; ts_double eps=0.001; // Take a look if EPS from math.h can be used /*lets initialize memory for temporary vertex_list. Should we write a function instead */ ts_vertex_list *tvlist=vertex_list_copy(vlist); ts_vertex **tvtx=tvlist->vtx -1; /* again to compensate for 0-indexing */ ts_double dist2; // Square of distance of neighbours ts_double direct; // Something, dont know what, but could be normal of some kind for(i=1;i<=vlist->n;i++){ k++; // WHY i IS NOT GOOD?? vtx_add_cneighbour(blist,tvtx[k], tvtx[vtx[i]->neigh[0]->idx+1]); //always add 1st jjj=1; jj=1; for(l=2;l<=vtx[i]->neigh_no;l++){ for(j=2;j<=vtx[i]->neigh_no;j++){ dist2=vtx_distance_sq(vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); direct=vtx_direct(vtx[i],vtx[i]->neigh[j-1],vtx[i]->neigh[jj-1]); // TODO: check if fabs can be used with all floating point types!! if( (direct>0.0) && (j!=jjj) ){ vtx_add_cneighbour(blist,tvtx[k],tvtx[vtx[i]->neigh[j-1]->idx+1]); jjj=jj; jj=j; // break; } } } if(vtx[i]->neigh_no!=tvtx[i]->neigh_no){ fprintf(stderr,"Hej! pri vtx=%d se razikuje stevilo sosedov (prej=%d, potem=%d)\n",i, vtx[i]->neigh_no, tvtx[i]->neigh_no); } } if(eps>dist2); /* We use the temporary vertex for our main vertices and we abandon main * vertices, because their neighbours are not correctly ordered */ // tvtx=vlist->vtx; // vlist->vtx=tvtx; // tvlist->vtx=vtx; vtx_list_free(vlist); /* Let's make a check if the number of bonds is correct */ if((blist->n)!=3*(tvlist->n-2)){ ts_fprintf(stderr,"Number of bonds is %u should be %u!\n", blist->n, 3*(tvlist->n-2)); fatal("Number of bonds is not 3*(no_vertex-2).",4); } return tvlist; }