136 #include "partCubitMesh.h"
139 #include "exodusII.h"
143 int count_elt(FILE *unit);
145 void setHexaWeight(mesh_t *mesh);
147 void readCubitMeshAbaqus(
char *fileinp, mesh_t *mesh,
int *number_of_elemnt_block);
149 void readCubitMeshExodus(
char *fileinp, mesh_t *mesh,
int *number_of_elemnt_block);
151 void read_part_cubit_mesh_(
char *fileinp
156 ,
int *ig_ncpu_neighbor
158 ,
int *ig_nhexa_outer
159 ,
int *ig_nquad_parax
160 ,
int *ig_nquad_fsurf
163 ,
float *rg_mesh_xmax
164 ,
float *rg_mesh_ymax
165 ,
float *rg_mesh_zmax
166 ,
float *rg_mesh_xmin
167 ,
float *rg_mesh_ymin
168 ,
float *rg_mesh_zmin);
170 int fill_mesh_arrays_ (
int *ig_ncpu
173 ,
int *ig_nneighbor_all_kind
175 ,
int *ig_cpu_neighbor_info
176 ,
int *ig_hexa_gnode_glonum
177 ,
int *ig_quadp_gnode_glonum
178 ,
int *ig_quadf_gnode_glonum
179 ,
int *ig_hexa_gll_glonum
180 ,
int *ig_quadp_gll_glonum
181 ,
int *ig_quadf_gll_glonum
182 ,
int *ig_quadp_neighbor_hexa
183 ,
int *ig_quadp_neighbor_hexaface
184 ,
int *ig_hexa_material_number);
190 ,
int *ig_nneighbor_all_kind
192 ,
int *ig_cpu_neighbor_info
193 ,
int *ig_hexa_gnode_glonum
194 ,
int *ig_quadp_gnode_glonum
195 ,
int *ig_quadf_gnode_glonum
196 ,
int *ig_hexa_gll_glonum
197 ,
int *ig_quadp_gll_glonum
198 ,
int *ig_quadf_gll_glonum
199 ,
int *ig_quadp_neighbor_hexa
200 ,
int *ig_quadp_neighbor_hexaface
201 ,
int *ig_hexa_material_number);
203 info_t *getConnInfo(mesh_t *mesh,
int rank,
int *ig_mesh_nnode);
205 int getProcConn(
int ielt,
int iproc, proc_info_t *proc_tab, mesh_t *mesh);
207 void setEltConn(
int ielt,
int iproc, elt_info_t *elt_tab, mesh_t *mesh, proc_info_t *proc_tab);
209 void setHexaConnDetail(
int elt_num,
int neigh_num,
int nb_conn,
int *connex_nodes, elt_info_t *elt_tab, mesh_t *mesh);
211 void setQuadConnDetail(
int elt_num,
int neigh_num,
int nb_conn,
int *connex_nodes, elt_info_t *elt_tab, mesh_t *mesh);
213 int findFaceOrientation(
int *connex_nodes,
int num_conn_source,
int num_conn_target);
215 int findEdgeOrientation(
int *connex_nodes,
int num_conn_source,
int num_conn_target);
221 void printMemUsage(mesh_t *mesh);
223 char* rotateVect(
char *ortn,
char *ret_or,
int cw_quarter_rot);
225 void add_conn(topo_t typecon, elt_info_t *elt_tab,
int hexa_src,
int numcon_src, idx_t num_neigh,
int numcon_neigh,
int orientation, elt_t type);
227 int getnbneigh(topo_t typecon, elt_info_t *elt_tab,
int numcon_src);
233 void get_domain_min_max(mesh_t *mesh,
float *rg_mesh_xmax,
float *rg_mesh_ymax,
float *rg_mesh_zmax,
float *rg_mesh_xmin,
float *rg_mesh_ymin,
float *rg_mesh_zmin);
236 void mod_init_mesh_mp_init_gll_number_(
int*,
int*);
238 void mod_init_mesh_mp_propagate_gll_nodes_face_(
int*,
int*,
int*,
int*,
int*);
240 void mod_init_mesh_mp_propagate_gll_nodes_edge_(
int*,
int*,
int*,
int*,
int*);
242 void mod_init_mesh_mp_propagate_gll_nodes_corner_(
int*,
int*,
int*,
int*);
244 void mod_init_mesh_mp_propagate_gll_nodes_quad_(
int*,
int*,
int*,
int*,
int*);
246 void pass_address_back_(
float *,
float *,
float *);
248 void allocate_node_coord_arrays_();
257 static mesh_t *mesh_ptr;
258 static info_t *info_ptr;
260 static int ncpu_neighbor, nhexa_local;
261 static int nquad_parax;
262 static int nquad_fsurf;
263 static int num_nodes_hexa;
270 void pass_address_back_(
float *rg_gnode_x,
float *rg_gnode_y,
float *rg_gnode_z)
279 free(mesh_ptr->xadj);
280 free(mesh_ptr->adjncy);
281 free(mesh_ptr->xadj_hex);
282 free(mesh_ptr->adjncy_hex);
283 free(mesh_ptr->ncoords_x);
284 free(mesh_ptr->ncoords_y);
285 free(mesh_ptr->ncoords_z);
291 for (iproc=0; iproc<mesh_ptr->npart; iproc++) {
292 free(info_ptr->proc[iproc].local_elts);
293 free(info_ptr->proc[iproc].connex);
295 free(info_ptr->proc);
297 int nbelt = mesh_ptr->nh;
298 for(
int i=0; i< nbelt; i++) {
299 elt_info_t elt = info_ptr->elt[i];
301 for (
int j=0; j<NEDGE; j++) {
303 conn_info* ptr = &elt.edges[j];
309 if (!first) free(ptr);
315 for (
int j=0; j<NCORNER; j++) {
317 conn_info* ptr = &elt.corners[j];
323 if (!first) free(ptr);
334 free(mesh_ptr->eptr);
335 free(mesh_ptr->eind);
336 if (mesh_ptr->hex27) {
337 free(mesh_ptr->eptr_27);
338 free(mesh_ptr->eind_27);
340 free(mesh_ptr->part);
341 free(mesh_ptr->layer);
342 free(mesh_ptr->vwgt);
343 free(mesh_ptr->types);
349 void read_part_cubit_mesh_(
char * prefix
353 ,
int * ig_mesh_nnode
354 ,
int * ig_ncpu_neighbor
356 ,
int * ig_nhexa_outer
357 ,
int * ig_nquad_parax
358 ,
int * ig_nquad_fsurf
359 ,
int * ig_hexa_nnode
360 ,
int * ig_quad_nnode
361 ,
float* rg_mesh_xmax
362 ,
float* rg_mesh_ymax
363 ,
float* rg_mesh_zmax
364 ,
float* rg_mesh_xmin
365 ,
float* rg_mesh_ymin
366 ,
float* rg_mesh_zmin)
375 int number_of_elemnt_block[N_BLOCK_MAX];
380 mesh = MALLOC(mesh_t, 1);
382 mesh->npart = *ig_ncpu;
389 strncpy(fileinp, prefix, 93);
390 strcat(fileinp, ".ex2");
391 FILE * check = fopen(fileinp, "r");
395 MSG(
"Found exodusII binary mesh file")
396 readCubitMeshExodus(fileinp, mesh, number_of_elemnt_block);
400 strncpy(fileinp, prefix, 93);
401 strcat(fileinp,
".inp");
402 check = fopen(fileinp,
"r");
405 MSG(
"Found abaqus ascii mesh file")
406 readCubitMeshAbaqus(fileinp, mesh, number_of_elemnt_block);
408 printf(
"\nMesh file not found (%s.ex2 or %s.inp)\naborting ...\n\n",prefix,prefix);
409 MPI_Abort(MPI_COMM_WORLD, 1);
415 MSG("Mesh information :")
416 printf("\t%d nodes\n",mesh->nn);
417 printf("\t%d nodes per hexahedron\n",mesh->num_nodes_hexa);
418 printf("\t%d hexahedron elements\n",mesh->nh);
419 printf("\t%d quadrangle elements as boundary absorption\n",mesh->nq_parax);
420 printf("\t%d quadrangle elements as free surface snapshot\n",mesh->nq_surf);
422 MSG("Computation started: see *.lst file for more information")
424 get_domain_min_max( mesh, rg_mesh_xmax, rg_mesh_ymax, rg_mesh_zmax, rg_mesh_xmin, rg_mesh_ymin, rg_mesh_zmin);
426 r_buf[0] = *rg_mesh_xmax;
427 r_buf[1] = *rg_mesh_ymax;
428 r_buf[2] = *rg_mesh_zmax;
429 r_buf[3] = *rg_mesh_xmin;
430 r_buf[4] = *rg_mesh_ymin;
431 r_buf[5] = *rg_mesh_zmin;
432 MPI_Bcast( r_buf, 6, MPI_FLOAT, 0, MPI_COMM_WORLD);
434 MPI_Bcast( r_buf, 6, MPI_FLOAT, 0, MPI_COMM_WORLD);
435 *rg_mesh_xmax = r_buf[0];
436 *rg_mesh_ymax = r_buf[1];
437 *rg_mesh_zmax = r_buf[2];
438 *rg_mesh_xmin = r_buf[3];
439 *rg_mesh_ymin = r_buf[4];
440 *rg_mesh_zmin = r_buf[5];
448 METIS_MeshToDual(&mesh->ne, &mesh->nn, mesh->eptr, mesh->eind, &ncommon, &pnumflag, &mesh->xadj, &mesh->adjncy);
452 METIS_MeshToDual(&mesh->nh, &mesh->nn, mesh->eptr, mesh->eind, &ncommon, &pnumflag, &mesh->xadj_hex, &mesh->adjncy_hex);
459 if (mesh->npart > 1) {
461 METIS_PartGraphRecursive(&mesh->nh, &mesh->ncon, mesh->xadj_hex, mesh->adjncy_hex, mesh->vwgt, NULL, NULL, &mesh->npart, NULL, NULL, NULL, &edgecuts, mesh->part);
464 for (
int hh=0; hh<mesh->nh; hh++) {
465 if (mesh->part[hh] == rank) numelem++;
470 memset(mesh->part, 0, mesh->nh*
sizeof(idx_t));
478 info_t* info = getConnInfo(mesh, rank, ig_mesh_nnode);
480 for (iproc = 0; iproc < mesh->npart; iproc++) {
483 *size_real_t =
sizeof(real_t);
484 *ig_nhexa = info->proc[iproc].nb_elt;
485 *ig_nhexa_outer = info->proc[iproc].nb_ext;
486 *ig_nquad_parax = info->proc[iproc].nb_quad_p;
487 *ig_nquad_fsurf = info->proc[iproc].nb_quad_f;
488 *ig_hexa_nnode = mesh->num_nodes_hexa;
489 *ig_ncpu_neighbor = info->proc[iproc].nb_conn;
490 *ig_quad_nnode = mesh->num_node_per_dim*mesh->num_node_per_dim;
492 i_buf[0] =
sizeof(real_t);
493 i_buf[1] = info->proc[iproc].nb_elt;
494 i_buf[2] = info->proc[iproc].nb_ext;
495 i_buf[3] = info->proc[iproc].nb_quad_p;
496 i_buf[4] = info->proc[iproc].nb_quad_f;
497 i_buf[5] = mesh->num_nodes_hexa;
498 i_buf[6] = info->proc[iproc].nb_conn;
499 i_buf[7] = mesh->num_node_per_dim*mesh->num_node_per_dim;
500 MPI_Send(i_buf, 8, MPI_INT, iproc, 5, MPI_COMM_WORLD);
507 getConnInfo(mesh, rank, ig_mesh_nnode);
508 MPI_Recv(i_buf, 8, MPI_INT, 0, 5, MPI_COMM_WORLD, &status);
509 *size_real_t = i_buf[0];
510 *ig_nhexa = i_buf[1];
511 *ig_nhexa_outer = i_buf[2];
512 *ig_nquad_parax = i_buf[3];
513 *ig_nquad_fsurf = i_buf[4];
514 *ig_hexa_nnode = i_buf[5];
515 *ig_ncpu_neighbor = i_buf[6];
516 *ig_quad_nnode = i_buf[7];
521 ncpu_neighbor = *ig_ncpu_neighbor;
522 nhexa_local = *ig_nhexa;
523 nquad_parax = *ig_nquad_parax;
524 nquad_fsurf = *ig_nquad_fsurf;
525 num_nodes_hexa = *ig_hexa_nnode;
529 if (rank == 0) free_all_1();
534 void get_domain_min_max(mesh_t* mesh,
float* rg_mesh_xmax,
float* rg_mesh_ymax,
float* rg_mesh_zmax,
float* rg_mesh_xmin,
float* rg_mesh_ymin,
float* rg_mesh_zmin)
536 float xmin, ymin, zmin;
537 float xmax, ymax, zmax;
538 xmin = ymin = zmin = +FLT_MAX;
539 xmax = ymax = zmax = -FLT_MAX;
541 for (
int node=0; node<mesh->nn; node++) {
542 if (mesh->ncoords_x[node] < xmin) xmin = mesh->ncoords_x[node];
543 if (mesh->ncoords_y[node] < ymin) ymin = mesh->ncoords_y[node];
544 if (mesh->ncoords_z[node] < zmin) zmin = mesh->ncoords_z[node];
546 if (mesh->ncoords_x[node] > xmax) xmax = mesh->ncoords_x[node];
547 if (mesh->ncoords_y[node] > ymax) ymax = mesh->ncoords_y[node];
548 if (mesh->ncoords_z[node] > zmax) zmax = mesh->ncoords_z[node];
551 *rg_mesh_xmax = xmax;
552 *rg_mesh_ymax = ymax;
553 *rg_mesh_zmax = zmax;
555 *rg_mesh_xmin = xmin;
556 *rg_mesh_ymin = ymin;
557 *rg_mesh_zmin = zmin;
560 int fill_mesh_arrays_(
int* nb_part_,
563 int* ig_nneighbor_all_kind,
565 int* ig_cpu_neighbor_info,
566 int* ig_hexa_gnode_glonum,
567 int* ig_quadp_gnode_glonum,
568 int* ig_quadf_gnode_glonum,
569 int* ig_hexa_gll_glonum,
570 int* ig_quadp_gll_glonum,
571 int* ig_quadf_gll_glonum,
572 int* ig_quadp_neighbor_hexa,
573 int* ig_quadp_neighbor_hexaface,
574 int* ig_hexa_material_number)
577 mesh_t* mesh = mesh_ptr;
578 info_t* info = info_ptr;
584 , ig_nneighbor_all_kind
586 , ig_cpu_neighbor_info
587 , ig_hexa_gnode_glonum
588 , ig_quadp_gnode_glonum
589 , ig_quadf_gnode_glonum
591 , ig_quadp_gll_glonum
592 , ig_quadf_gll_glonum
593 , ig_quadp_neighbor_hexa
594 , ig_quadp_neighbor_hexaface
595 , ig_hexa_material_number);
597 if (*rank_ == 0) free_all_2();
609 ,
int * ig_ngll_total
610 ,
int * ig_nneighbor_all_kind
612 ,
int * ig_cpu_neighbor_info
613 ,
int * ig_hexa_gnode_glonum
614 ,
int * ig_quadp_gnode_glonum
615 ,
int * ig_quadf_gnode_glonum
616 ,
int * ig_hexa_gll_glonum
617 ,
int * ig_quadp_gll_glonum
618 ,
int * ig_quadf_gll_glonum
619 ,
int * ig_quadp_neighbor_hexa
620 ,
int * ig_quadp_neighbor_hexaface
621 ,
int * ig_hexa_material_number)
623 int iproc, ineigh, ielt, i, j, k;
624 int* i_buf, *ibuf_hexa_material_number, *ibuf_hexa_gnode_glonum;
625 proc_info_t* proc_tab;
627 int* nneighbor_all_kind;
628 int* cpu_neighbor_info;
629 int* ibuf_quadp_neighbor_hexa;
630 int* ibuf_quadp_neighbor_hexaface;
633 int icpu, iparax, ifsurf;
635 idx_t *p_eptr, *p_eind;
637 p_eptr = mesh->eptr_27;
638 p_eind = mesh->eind_27;
645 proc_tab = info->proc;
648 for(iproc = 0; iproc<mesh->npart; iproc++) {
651 for(ineigh = 0; ineigh<mesh->npart; ineigh++) {
652 if (proc_tab[iproc].connex[ineigh]) cpu_neighbor[icpu++] = ineigh;
656 i_buf = MALLOC(
int, proc_tab[iproc].nb_conn);
658 for(ineigh = 0; ineigh<mesh->npart; ineigh++) {
659 if (proc_tab[iproc].connex[ineigh]) i_buf[icpu++] = ineigh;
661 MPI_Send(i_buf, proc_tab[iproc].nb_conn, MPI_INT, iproc, 10, MPI_COMM_WORLD);
666 MPI_Recv(cpu_neighbor, ncpu_neighbor, MPI_INT, 0, 10, MPI_COMM_WORLD, &status);
669 for(iproc = 0; iproc<mesh->npart; iproc++) {
670 int nneighbor_all_kind = 0;
674 ibuf_hexa_material_number = MALLOC(
int, proc_tab[iproc].nb_elt);
675 ibuf_hexa_gnode_glonum = MALLOC(
int, proc_tab[iproc].nb_elt*mesh->num_nodes_hexa);
677 ibuf_quadp_neighbor_hexa = MALLOC(
int, proc_tab[iproc].nb_quad_p);
678 ibuf_quadp_neighbor_hexaface = MALLOC(
int, proc_tab[iproc].nb_quad_p);
680 i_buf = MALLOC(
int, 7*26*info->proc[iproc].nb_elt);
681 cpu_neighbor_info = MALLOC(
int, 3*26*info->proc[iproc].nb_ext);
687 for (ielt=0; ielt<proc_tab[iproc].nb_elt; ielt++) {
690 int ielt_num, ielt_number, ielt_face, ielt_edge, ielt_corner, ielt_coty, ielt_cpu;
692 elt_info_t* curhex = proc_tab[iproc].local_elts[ielt];
693 int globnum = curhex->globalnum;
696 if (iproc != 0) ibuf_hexa_material_number[ielt] = mesh->layer[globnum];
697 else ig_hexa_material_number[ielt] = mesh->layer[globnum];
700 for (i=0; i<mesh->num_nodes_hexa; i++) {
703 if (p_eind[p_eptr[globnum]+corner2efispec[i]-1] == 0) {
704 STOP(
"num node should not be 0 (fortran arrays start at 1)");
706 if (iproc != 0) ibuf_hexa_gnode_glonum[ielt * mesh->num_nodes_hexa + i] = p_eind[p_eptr[globnum]+corner2efispec[i]-1];
707 else ig_hexa_gnode_glonum[ielt * mesh->num_nodes_hexa + i] = p_eind[p_eptr[globnum]+corner2efispec[i]-1];
709 if (iproc == 0) mod_init_mesh_mp_init_gll_number_(&ihexa,ig_ngll_total);
712 for (i=0; i<NFACE; i++) {
715 int type = curhex->faces[i].type;
718 ielt_num = elt_tab[curhex->faces[i].num_neigh].localnum + 1;
719 ielt_face = face2efispec[curhex->faces[i].num_conn];
720 ielt_coty = curhex->faces[i].orientation;
721 ielt_cpu = mesh->part[curhex->faces[i].num_neigh];
722 if (ielt_cpu == iproc) {
723 if (iproc == 0) mod_init_mesh_mp_propagate_gll_nodes_face_(&ihexa, &iface, &ielt_num, &ielt_face, &ielt_coty);
725 i_buf[nb_items*7] = FACE*10+HEXA;
726 i_buf[nb_items*7+1] = ihexa;
727 i_buf[nb_items*7+2] = iface;
728 i_buf[nb_items*7+3] = ielt_num;
729 i_buf[nb_items*7+4] = ielt_face;
730 i_buf[nb_items*7+5] = ielt_coty;
731 i_buf[nb_items*7+6] = FACE;
736 if (*ig_nneighbor_all_kind >= 26*info->proc[iproc].nb_ext) STOP(
"ig_nneighbor_all_kind too large\n");
737 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 0] = ihexa;
738 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 1] = iface;
739 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 2] = ielt_cpu;
740 (*ig_nneighbor_all_kind)++;
742 if (nneighbor_all_kind >= 26*info->proc[iproc].nb_ext) STOP(
"nneighbor_all_kind too large\n");
743 cpu_neighbor_info[nneighbor_all_kind*3 + 0] = ihexa;
744 cpu_neighbor_info[nneighbor_all_kind*3 + 1] = iface;
745 cpu_neighbor_info[nneighbor_all_kind*3 + 2] = ielt_cpu;
746 nneighbor_all_kind++;
752 ig_quadp_neighbor_hexa[iparax] = ihexa;
753 ig_quadp_neighbor_hexaface[iparax] = iface;
755 ibuf_quadp_neighbor_hexa[iparax] = ihexa;
756 ibuf_quadp_neighbor_hexaface[iparax] = iface;
759 if (mesh->num_node_per_dim*mesh->num_node_per_dim == 4) {
761 case 1 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+0];
762 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+1];
763 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+2];
764 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+3];
766 case 2 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+0];
767 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+4];
768 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+5];
769 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+1];
771 case 3 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+1];
772 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+5];
773 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+6];
774 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+2];
776 case 4 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+3];
777 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+2];
778 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+6];
779 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+7];
781 case 5 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+0];
782 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+3];
783 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+7];
784 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+4];
786 case 6 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+4];
787 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+7];
788 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+6];
789 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+5];
793 STOP(
"not yet ready for 27 nodes elements\n");
798 if (iproc == 0) mod_init_mesh_mp_propagate_gll_nodes_quad_(&ihexa, &iface, &iparax, ig_quadp_gll_glonum, &info->proc[iproc].nb_quad_p);
800 i_buf[nb_items*7] = FACE*10+QUAD_P;
801 i_buf[nb_items*7+1] = ihexa;
802 i_buf[nb_items*7+2] = iface;
803 i_buf[nb_items*7+3] = iparax;
804 i_buf[nb_items*7+4] = 0;
805 i_buf[nb_items*7+5] = info->proc[iproc].nb_quad_p;
806 i_buf[nb_items*7+6] = FACE;
813 if (mesh->num_node_per_dim*mesh->num_node_per_dim == 4) {
815 case 1 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+0];
816 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+1];
817 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+2];
818 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+3];
820 case 2 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+0];
821 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+4];
822 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+5];
823 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+1];
825 case 3 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+1];
826 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+5];
827 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+6];
828 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+2];
830 case 4 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+3];
831 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+2];
832 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+6];
833 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+7];
835 case 5 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+0];
836 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+3];
837 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+7];
838 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+4];
840 case 6 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+4];
841 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+7];
842 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+6];
843 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*mesh->num_nodes_hexa+5];
847 STOP(
"not yet ready for 27 nodes elements\n");
852 if (iproc == 0) mod_init_mesh_mp_propagate_gll_nodes_quad_(&ihexa, &iface, &ifsurf, ig_quadf_gll_glonum, &info->proc->nb_quad_f);
854 i_buf[nb_items*7] = FACE*10+QUAD_F;
855 i_buf[nb_items*7+1] = ihexa;
856 i_buf[nb_items*7+2] = iface;
857 i_buf[nb_items*7+3] = ifsurf;
858 i_buf[nb_items*7+4] = 0;
859 i_buf[nb_items*7+5] = info->proc[iproc].nb_quad_f;
860 i_buf[nb_items*7+6] = FACE;
868 for (i=0; i<NEDGE; i++) {
870 conn_info* ptr = &curhex->edges[i];
871 int nb_neighbor = getnbneigh(EDGE, curhex, i);
872 for (
int ineigh = 0; ineigh < nb_neighbor; ineigh++) {
874 case HEXA : ielt_number = elt_tab[ptr->num_neigh].localnum + 1;
875 ielt_edge = edge2efispec[ptr->num_conn];
876 ielt_coty = ptr->orientation;
877 ielt_cpu = mesh->part[ptr->num_neigh];
878 if (ielt_cpu == iproc) {
879 if (ielt_number > ihexa) {
881 mod_init_mesh_mp_propagate_gll_nodes_edge_(&ihexa, &iedge, &ielt_number, &ielt_edge, &ielt_coty);
883 i_buf[nb_items*7] = EDGE*10+HEXA;
884 i_buf[nb_items*7+1] = ihexa;
885 i_buf[nb_items*7+2] = iedge;
886 i_buf[nb_items*7+3] = ielt_number;
887 i_buf[nb_items*7+4] = ielt_edge;
888 i_buf[nb_items*7+5] = ielt_coty;
889 i_buf[nb_items*7+6] = nb_neighbor;
895 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 0] = ihexa;
896 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 1] = NFACE + iedge;
897 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 2] = ielt_cpu;
898 (*ig_nneighbor_all_kind)++;
900 cpu_neighbor_info[nneighbor_all_kind*3 + 0] = ihexa;
901 cpu_neighbor_info[nneighbor_all_kind*3 + 1] = NFACE + iedge;
902 cpu_neighbor_info[nneighbor_all_kind*3 + 2] = ielt_cpu;
903 nneighbor_all_kind++;
907 default : STOP(
"edge neighbor should be an hexa");
913 for (j=0; j<NCORNER; j++) {
915 i = cornerefispec2cubit[j];
916 conn_info* ptr = &curhex->corners[i];
917 int nb_neighbor = getnbneigh(CORNER, curhex, i);
918 for (k=0; k<nb_neighbor; k++) {
920 case HEXA : ielt_number = elt_tab[ptr->num_neigh].localnum + 1;
921 ielt_corner = corner2efispec[ptr->num_conn];
922 ielt_cpu = mesh->part[ptr->num_neigh];
923 if (ielt_cpu == iproc) {
924 if (ielt_number > ihexa) {
926 mod_init_mesh_mp_propagate_gll_nodes_corner_(&ihexa, &inode, &ielt_number, &ielt_corner);
928 i_buf[nb_items*7] = CORNER*10+HEXA;
929 i_buf[nb_items*7+1] = ihexa;
930 i_buf[nb_items*7+2] = inode;
931 i_buf[nb_items*7+3] = ielt_number;
932 i_buf[nb_items*7+4] = ielt_corner;
933 i_buf[nb_items*7+5] = 0;
934 i_buf[nb_items*7+6] = nb_neighbor;
940 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 0] = ihexa;
941 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 1] = NFACE + NEDGE + inode;
942 ig_cpu_neighbor_info[*ig_nneighbor_all_kind*3 + 2] = ielt_cpu;
943 (*ig_nneighbor_all_kind)++;
945 cpu_neighbor_info[nneighbor_all_kind*3 + 0] = ihexa;
946 cpu_neighbor_info[nneighbor_all_kind*3 + 1] = NFACE + NEDGE + inode;
947 cpu_neighbor_info[nneighbor_all_kind*3 + 2] = ielt_cpu;
948 nneighbor_all_kind++;
952 default : STOP(
"corner neighbor should be an hexa");
959 if (iparax != info->proc[iproc].nb_quad_p || ifsurf != info->proc[iproc].nb_quad_f) STOP(
"problem with quad number");
962 MPI_Send(ibuf_hexa_material_number, proc_tab[iproc].nb_elt, MPI_INT, iproc, 21, MPI_COMM_WORLD);
963 MPI_Send(ibuf_hexa_gnode_glonum, proc_tab[iproc].nb_elt*mesh->num_nodes_hexa, MPI_INT, iproc, 22, MPI_COMM_WORLD);
964 MPI_Send(ibuf_quadp_neighbor_hexa, proc_tab[iproc].nb_quad_p, MPI_INT, iproc, 23, MPI_COMM_WORLD);
965 MPI_Send(ibuf_quadp_neighbor_hexaface, proc_tab[iproc].nb_quad_p, MPI_INT, iproc, 24, MPI_COMM_WORLD);
968 ibuf2[1] = nneighbor_all_kind;
969 MPI_Send(ibuf2, 2, MPI_INT, iproc, 25, MPI_COMM_WORLD);
971 MPI_Send(i_buf, nb_items*7, MPI_INT, iproc, 26, MPI_COMM_WORLD);
972 MPI_Send(cpu_neighbor_info, 3*nneighbor_all_kind, MPI_INT, iproc, 27, MPI_COMM_WORLD);
974 free(ibuf_hexa_material_number);
975 free(ibuf_hexa_gnode_glonum);
976 free(ibuf_quadp_neighbor_hexa);
977 free(ibuf_quadp_neighbor_hexaface);
979 free(cpu_neighbor_info);
983 i_buf = MALLOC(
int, 6*26*nhexa_local);
984 MPI_Recv(ig_hexa_material_number, nhexa_local, MPI_INT, 0, 21, MPI_COMM_WORLD, &status);
985 MPI_Recv(ig_hexa_gnode_glonum, nhexa_local*num_nodes_hexa, MPI_INT, 0, 22, MPI_COMM_WORLD, &status);
986 MPI_Recv(ig_quadp_neighbor_hexa, nquad_parax, MPI_INT, 0, 23, MPI_COMM_WORLD, &status);
987 MPI_Recv(ig_quadp_neighbor_hexaface, nquad_parax, MPI_INT, 0, 24, MPI_COMM_WORLD, &status);
989 MPI_Recv(ibuf2, 2, MPI_INT, 0, 25, MPI_COMM_WORLD, &status);
991 *ig_nneighbor_all_kind = nneighbor_all_kind = ibuf2[1];
993 MPI_Recv(i_buf, nb_items*7, MPI_INT, 0, 26, MPI_COMM_WORLD, &status);
994 MPI_Recv(ig_cpu_neighbor_info, 3*nneighbor_all_kind, MPI_INT, 0, 27, MPI_COMM_WORLD, &status);
996 for (ielt=0; ielt < nhexa_local; ielt++) {
999 mod_init_mesh_mp_init_gll_number_(&ihexa,ig_ngll_total);
1001 for (i=0; i<NFACE; i++) {
1003 if (i_buf[iibuf*7+6] == FACE && i_buf[iibuf*7+1] == ihexa && i_buf[iibuf*7+2] == iface) {
1004 int type = i_buf[iibuf*7];
1006 case FACE*10+HEXA : mod_init_mesh_mp_propagate_gll_nodes_face_(&i_buf[iibuf*7+1], &i_buf[iibuf*7+2], &i_buf[iibuf*7+3], &i_buf[iibuf*7+4], &i_buf[iibuf*7+5]);
1009 case FACE*10+QUAD_P : iparax = i_buf[iibuf*7+3]-1;
1010 assert(i_buf[iibuf*7+1]-1 == ielt);
1011 assert(i_buf[iibuf*7+2] == iface);
1013 case 1 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+0];
1014 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+1];
1015 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+2];
1016 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+3];
1018 case 2 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+0];
1019 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+4];
1020 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+5];
1021 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+1];
1023 case 3 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+1];
1024 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+5];
1025 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+6];
1026 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+2];
1028 case 4 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+3];
1029 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+2];
1030 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+6];
1031 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+7];
1033 case 5 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+0];
1034 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+3];
1035 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+7];
1036 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+4];
1038 case 6 : ig_quadp_gnode_glonum[iparax*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+4];
1039 ig_quadp_gnode_glonum[iparax*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+7];
1040 ig_quadp_gnode_glonum[iparax*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+6];
1041 ig_quadp_gnode_glonum[iparax*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+5];
1044 mod_init_mesh_mp_propagate_gll_nodes_quad_(&i_buf[iibuf*7+1], &i_buf[iibuf*7+2], &i_buf[iibuf*7+3], ig_quadp_gll_glonum, &i_buf[iibuf*7+5]);
1047 case FACE*10+QUAD_F : ifsurf = i_buf[iibuf*7+3]-1;
1048 assert(i_buf[iibuf*7+1]-1 == ielt);
1049 assert(i_buf[iibuf*7+2] == iface);
1051 case 1 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+0];
1052 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+1];
1053 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+2];
1054 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+3];
1056 case 2 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+0];
1057 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+4];
1058 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+5];
1059 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+1];
1061 case 3 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+1];
1062 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+5];
1063 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+6];
1064 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+2];
1066 case 4 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+3];
1067 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+2];
1068 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+6];
1069 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+7];
1071 case 5 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+0];
1072 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+3];
1073 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+7];
1074 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+4];
1076 case 6 : ig_quadf_gnode_glonum[ifsurf*4+0] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+4];
1077 ig_quadf_gnode_glonum[ifsurf*4+1] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+7];
1078 ig_quadf_gnode_glonum[ifsurf*4+2] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+6];
1079 ig_quadf_gnode_glonum[ifsurf*4+3] = ig_hexa_gnode_glonum[ielt*num_nodes_hexa+5];
1082 mod_init_mesh_mp_propagate_gll_nodes_quad_(&i_buf[iibuf*7+1], &i_buf[iibuf*7+2], &i_buf[iibuf*7+3], ig_quadf_gll_glonum, &i_buf[iibuf*7+5]);
1088 for (i=0; i<NEDGE; i++) {
1090 if (i_buf[iibuf*7] == EDGE*10+HEXA && i_buf[iibuf*7+1] == ihexa && i_buf[iibuf*7+2] == iedge) {
1091 int nb_neighbor = i_buf[iibuf*7+6];
1092 for (
int ineigh = 0; ineigh < nb_neighbor; ineigh++) {
1093 if (i_buf[iibuf*7] == EDGE*10+HEXA && i_buf[iibuf*7+1] == ihexa && i_buf[iibuf*7+2] == iedge) {
1094 mod_init_mesh_mp_propagate_gll_nodes_edge_(&i_buf[iibuf*7+1], &i_buf[iibuf*7+2], &i_buf[iibuf*7+3], &i_buf[iibuf*7+4], &i_buf[iibuf*7+5]);
1100 for (j=0; j<NCORNER; j++) {
1102 if (i_buf[iibuf*7] == CORNER*10+HEXA && i_buf[iibuf*7+1] == ihexa && i_buf[iibuf*7+2] == inode) {
1103 int nb_neighbor = i_buf[iibuf*7+6];
1104 for (
int ineigh = 0; ineigh < nb_neighbor; ineigh++) {
1105 if (i_buf[iibuf*7] == CORNER*10+HEXA && i_buf[iibuf*7+1] == ihexa && i_buf[iibuf*7+2] == inode) {
1106 mod_init_mesh_mp_propagate_gll_nodes_corner_(&i_buf[iibuf*7+1], &i_buf[iibuf*7+2], &i_buf[iibuf*7+3], &i_buf[iibuf*7+4]);
1114 assert(iibuf == nb_items);
1125 info_t* getConnInfo(mesh_t* mesh,
int rank,
int* ig_mesh_nnode)
1127 int inode, ielt, iproc, inodeptr;
1131 proc_info_t* proc_tab;
1132 elt_info_t * elt_tab;
1137 proc_tab = MALLOC(proc_info_t, mesh->npart);
1138 elt_tab = MALLOC(elt_info_t, mesh->nh);
1139 info = MALLOC(info_t, 1);
1140 info->proc = proc_tab;
1141 info->elt = elt_tab;
1143 for(iproc = 0; iproc<mesh->npart; iproc++) {
1145 proc_tab[iproc].connex = MALLOC(
char, mesh->npart);
1146 memset(proc_tab[iproc].connex, 0, mesh->npart*
sizeof(
char));
1147 proc_tab[iproc].nb_elt = 0;
1148 proc_tab[iproc].nb_conn = 0;
1149 proc_tab[iproc].nb_ext = 0;
1150 proc_tab[iproc].nb_quad_p = 0;
1151 proc_tab[iproc].nb_quad_f = 0;
1154 for(
int i=0; i<mesh->nh; i++) {
1156 for (j=0; j<NFACE; j++) {
1157 elt_tab[i].faces[j].defined = 0;
1159 for (j=0; j<NEDGE; j++) {
1160 elt_tab[i].edges[j].defined = 0;
1162 for (j=0; j<NCORNER; j++) {
1163 elt_tab[i].corners[j].defined = 0;
1168 for(ielt=0; ielt<mesh->nh; ielt++) {
1170 iproc = mesh->part[ielt];
1171 elt_tab[ielt].globalnum = ielt;
1174 elt_tab[ielt].outer = getProcConn(ielt, iproc, proc_tab, mesh);
1176 if (elt_tab[ielt].outer) proc_tab[iproc].nb_ext++;
1178 proc_tab[iproc].nb_elt++;
1180 setEltConn(ielt, iproc, elt_tab, mesh, proc_tab);
1184 nodeMask = MALLOC(idx_t, mesh->nn);
1187 idx_t *p_eptr, *p_eind;
1189 p_eptr = mesh->eptr_27;
1190 p_eind = mesh->eind_27;
1192 p_eptr = mesh->eptr;
1193 p_eind = mesh->eind;
1197 for (iproc = mesh->npart-1; iproc >= 0; iproc--) {
1200 memset(nodeMask, 0, mesh->nn*
sizeof(idx_t));
1202 for(ielt=0; ielt<mesh->nh; ielt++) {
1203 if (mesh->part[ielt] == iproc) {
1204 for(inodeptr = p_eptr[ielt]; inodeptr<p_eptr[ielt+1]; inodeptr++) {
1205 if (nodeMask[p_eind[inodeptr]] == 0) {
1207 nodeMask[p_eind[inodeptr]]++;
1214 buff_coord = MALLOC(
float, nb_local_nodes*3);
1215 MPI_Send(&nb_local_nodes, 1, MPI_INT, iproc, 0, MPI_COMM_WORLD);
1217 *ig_mesh_nnode = nb_local_nodes;
1221 allocate_node_coord_arrays_();
1224 if (rank == iproc) {
1226 MPI_Recv(ig_mesh_nnode, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
1227 buff_coord = MALLOC(
float, *ig_mesh_nnode*3);
1228 allocate_node_coord_arrays_();
1234 memset(nodeMask, 0, mesh->nn*
sizeof(idx_t));
1236 for(ielt=0; ielt<mesh->nh; ielt++) {
1237 if (mesh->part[ielt] == iproc) {
1238 for(inodeptr = p_eptr[ielt]; inodeptr<p_eptr[ielt+1]; inodeptr++) {
1239 int globalnodenum = p_eind[inodeptr];
1240 if (nodeMask[globalnodenum] == 0) {
1241 nodeMask[globalnodenum] = ++nb_local_nodes;
1242 p_eind[inodeptr] = nb_local_nodes;
1245 xcoord[nb_local_nodes-1] = mesh->ncoords_x[globalnodenum];
1246 ycoord[nb_local_nodes-1] = mesh->ncoords_y[globalnodenum];
1247 zcoord[nb_local_nodes-1] = mesh->ncoords_z[globalnodenum];
1249 buff_coord[(nb_local_nodes-1)*3] = mesh->ncoords_x[globalnodenum];
1250 buff_coord[(nb_local_nodes-1)*3+1] = mesh->ncoords_y[globalnodenum];
1251 buff_coord[(nb_local_nodes-1)*3+2] = mesh->ncoords_z[globalnodenum];
1254 int localnumber = nodeMask[globalnodenum];
1255 p_eind[inodeptr] = localnumber;
1261 MPI_Send(buff_coord, nb_local_nodes*3, MPI_FLOAT, iproc, 1, MPI_COMM_WORLD);
1265 if (rank == iproc) {
1266 MPI_Recv(buff_coord, *ig_mesh_nnode*3, MPI_FLOAT, 0, 1, MPI_COMM_WORLD, &status);
1267 for (inode = 0; inode<*ig_mesh_nnode; inode++) {
1268 xcoord[inode] = buff_coord[inode*3];
1269 ycoord[inode] = buff_coord[inode*3+1];
1270 zcoord[inode] = buff_coord[inode*3+2];
1282 num_outer = MALLOC(
int, mesh->npart);
1283 num_inner = MALLOC(
int, mesh->npart);
1284 for (iproc=0; iproc<mesh->npart; iproc++) {
1285 num_outer[iproc] = 0;
1286 num_inner[iproc] = proc_tab[iproc].nb_ext;
1287 proc_tab[iproc].local_elts = MALLOC(elt_info_t*, proc_tab[iproc].nb_elt);
1291 for(ielt=0; ielt<mesh->nh; ielt++) {
1292 int elt_proc = mesh->part[ielt];
1293 if (elt_tab[ielt].outer) {
1294 proc_tab[elt_proc].local_elts[num_outer[elt_proc]] = &elt_tab[ielt];
1295 elt_tab[ielt].localnum = num_outer[elt_proc]++;
1297 proc_tab[elt_proc].local_elts[num_inner[elt_proc]] = &elt_tab[ielt];
1298 elt_tab[ielt].localnum = num_inner[elt_proc]++;
1309 void setEltConn(
int ielt,
int iproc, elt_info_t* elt_tab, mesh_t* mesh, proc_info_t* proc_tab)
1311 int ineig, inode, inode_n, i;
1313 int num_node_per_face = 4;
1316 connex_nodes = MALLOC(
int, (2*num_node_per_face));
1318 for (i=0; i<6; i++) {
1319 elt_tab[ielt].faces[i].type = NONE;
1320 elt_tab[ielt].faces[i].next = NULL;
1321 elt_tab[ielt].faces[i].defined = 0;
1323 for (i=0; i<12; i++) {
1324 elt_tab[ielt].edges[i].type = NONE;
1325 elt_tab[ielt].edges[i].next = NULL;
1326 elt_tab[ielt].edges[i].defined = 0;
1328 for (i=0; i<8; i++) {
1329 elt_tab[ielt].corners[i].type = NONE;
1330 elt_tab[ielt].corners[i].next = NULL;
1331 elt_tab[ielt].corners[i].defined = 0;
1335 for (ineig = mesh->xadj_hex[ielt]; ineig < mesh->xadj_hex[ielt+1]; ineig++) {
1336 int neigh = mesh->adjncy_hex[ineig];
1340 for(inode = mesh->eptr[ielt]; inode < mesh->eptr[ielt+1]; inode++) {
1341 for(inode_n = mesh->eptr[neigh]; inode_n < mesh->eptr[neigh+1]; inode_n++) {
1342 if (mesh->eind[inode] == mesh->eind[inode_n]) {
1343 connex_nodes[nb_conn] = inode - mesh->eptr[ielt];
1344 connex_nodes[nb_conn+num_node_per_face] = inode_n - mesh->eptr[neigh];
1351 setHexaConnDetail(ielt, neigh, nb_conn, connex_nodes, elt_tab, mesh);
1353 STOP(
"neighbor without contact");
1358 for (ineig = mesh->xadj[ielt]; ineig < mesh->xadj[ielt+1]; ineig++) {
1359 int neigh = mesh->adjncy[ineig];
1360 if (neigh >= mesh->nh) {
1361 if (mesh->types[neigh] == QUAD_P) {
1362 proc_tab[iproc].nb_quad_p++;
1364 proc_tab[iproc].nb_quad_f++;
1368 for(inode = mesh->eptr[ielt]; inode < mesh->eptr[ielt+1]; inode++) {
1369 for(inode_n = mesh->eptr[neigh]; inode_n < mesh->eptr[neigh+1]; inode_n++) {
1370 if (mesh->eind[inode] == mesh->eind[inode_n]) {
1371 connex_nodes[nb_conn] = inode - mesh->eptr[ielt];
1372 connex_nodes[nb_conn+num_node_per_face] = inode_n - mesh->eptr[neigh];
1378 assert(nb_conn == N_NODES_QUAD);
1379 setQuadConnDetail(ielt, neigh, nb_conn, connex_nodes, elt_tab, mesh);
1381 STOP(
"neighbor quad without contact");
1391 void setQuadConnDetail(
int elt_num,
int neigh_num,
int nb_conn,
int* connex_nodes, elt_info_t* elt_tab, mesh_t* mesh)
1393 int face, inode, inode2;
1396 for(inode = 0; inode<4; inode++) {
1397 if (connex_nodes[inode] == CORNER1) {
1398 for(inode2 = 0; inode2<4; inode2++) {
1399 switch(connex_nodes[inode2]) {
1400 case CORNER3 : face = FACE1;
goto face_continue;
1401 case CORNER6 : face = FACE2;
goto face_continue;
1402 case CORNER8 : face = FACE5;
goto face_continue;
1405 }
else if(connex_nodes[inode] == CORNER7) {
1406 for(inode2 = 0; inode2<4; inode2++) {
1407 switch(connex_nodes[inode2]) {
1408 case CORNER4 : face = FACE4;
goto face_continue;
1409 case CORNER5 : face = FACE6;
goto face_continue;
1410 case CORNER2 : face = FACE3;
goto face_continue;
1417 STOP(
"error in face search")
1419 add_conn(FACE, elt_tab, elt_num, face, neigh_num, 0, 0, mesh->types[neigh_num]);
1424 void setHexaConnDetail(
int elt_num,
int neigh_num,
int nb_conn,
int* connex_nodes, elt_info_t* elt_tab, mesh_t* mesh)
1426 int icase, inode, inode2, num_conn_source, num_conn_target;
1430 num_conn_source = connex_nodes[0];
1431 num_conn_target = connex_nodes[4];
1432 add_conn(CORNER, elt_tab, elt_num, num_conn_source, neigh_num, num_conn_target, 0, HEXA);
1435 for(icase = 0; icase<2; icase++) {
1437 int offset = icase*4;
1438 for(inode = 0; inode<2; inode++) {
1439 switch(connex_nodes[inode+offset]) {
1441 for(inode2 = 0; inode2<2; inode2++) {
1442 switch(connex_nodes[inode2+offset]) {
1444 edge = EDGE1;
goto edge_continue;
1446 edge = EDGE4;
goto edge_continue;
1448 edge = EDGE9;
goto edge_continue;
1452 for(inode2 = 0; inode2<2; inode2++) {
1453 switch(connex_nodes[inode2+offset]) {
1455 edge = EDGE10;
goto edge_continue;
1457 edge = EDGE6;
goto edge_continue;
1459 edge = EDGE5;
goto edge_continue;
1463 for(inode2 = 0; inode2<2; inode2++) {
1464 switch(connex_nodes[inode2+offset]) {
1466 edge = EDGE2;
goto edge_continue;
1468 edge = EDGE3;
goto edge_continue;
1470 edge = EDGE11;
goto edge_continue;
1474 for(inode2 = 0; inode2<2; inode2++) {
1475 switch(connex_nodes[inode2+offset]) {
1477 edge = EDGE7;
goto edge_continue;
1479 edge = EDGE12;
goto edge_continue;
1481 edge = EDGE8;
goto edge_continue;
1488 STOP(
"error in edge search")
1491 num_conn_source = edge;
1493 num_conn_target = edge;
1496 add_conn(EDGE, elt_tab, elt_num, num_conn_source, neigh_num, num_conn_target, findEdgeOrientation(connex_nodes, num_conn_source, num_conn_target), HEXA);
1500 for(icase = 0; icase<2; icase++) {
1502 int offset = icase*4;
1503 for(inode = 0; inode<4; inode++) {
1504 if (connex_nodes[inode+offset] == CORNER1) {
1505 for(inode2 = 0; inode2<4; inode2++) {
1506 switch(connex_nodes[inode2+offset]) {
1507 case CORNER3 : face = FACE1;
goto face_continue;
1508 case CORNER6 : face = FACE2;
goto face_continue;
1509 case CORNER8 : face = FACE5;
goto face_continue;
1512 }
else if(connex_nodes[inode+offset] == CORNER7) {
1513 for(inode2 = 0; inode2<4; inode2++) {
1514 switch(connex_nodes[inode2+offset]) {
1515 case CORNER4 : face = FACE4;
goto face_continue;
1516 case CORNER5 : face = FACE6;
goto face_continue;
1517 case CORNER2 : face = FACE3;
goto face_continue;
1524 STOP(
"error in face search")
1527 num_conn_source= face;
1529 num_conn_target= face;
1532 add_conn(FACE, elt_tab, elt_num, num_conn_source, neigh_num, num_conn_target, findFaceOrientation(connex_nodes, num_conn_source, num_conn_target), HEXA);
1535 STOP(
"Error in nb nodes connected")
1542 int getProcConn(
int ielt,
int iproc, proc_info_t* proc_tab, mesh_t* mesh)
1547 for (ineig = mesh->xadj_hex[ielt]; ineig < mesh->xadj_hex[ielt+1]; ineig++) {
1548 int neigh = mesh->adjncy_hex[ineig];
1549 int neig_proc = mesh->part[neigh];
1550 if (neig_proc != iproc) {
1551 if (!proc_tab[iproc].connex[neig_proc]) {
1552 proc_tab[iproc].connex[neig_proc] = 1;
1553 proc_tab[iproc].nb_conn++;
1562 void setHexaWeight(mesh_t* mesh)
1567 mesh->vwgt = MALLOC(idx_t, mesh->nh);
1568 for(ihex=0; ihex<mesh->nh; ihex++) {
1569 mesh->vwgt[ihex] = HEXA_WEIGHT;
1570 for (ineigh = mesh->xadj[ihex]; ineigh<mesh->xadj[ihex+1]; ineigh++) {
1571 idx_t neigh = mesh->adjncy[ineigh];
1572 if(mesh->types[neigh] == QUAD_P) mesh->vwgt[ihex] += QUAD_P_WEIGHT;
1573 if(mesh->types[neigh] == QUAD_F) mesh->vwgt[ihex] += QUAD_F_WEIGHT;
1579 void printMemUsage(mesh_t* mesh) {
1586 sum += mesh->npart *
sizeof(proc_info_t);
1587 sum += mesh->nh *
sizeof(elt_info_t);
1588 sum +=
sizeof(info_t);
1589 sum += mesh->npart * mesh->npart *
sizeof(char);
1590 sum += mesh->nh *
sizeof(elt_info_t*);
1591 sum += (2*mesh->nh + mesh->ne+1 + mesh->nh * mesh->num_nodes_hexa + (mesh->nq_parax + mesh->nq_surf) * mesh->num_nodes_quad) *
sizeof(idx_t);
1592 sum += mesh->nh *
sizeof(
unsigned char);
1593 sum += mesh->nn * 3 *
sizeof(real_t);
1594 sum += mesh->ne *
sizeof(elt_t);
1595 sum += mesh->nn *
sizeof(idx_t);
1597 while(sum > un<<(i*10)) i++;
1599 case 1 : unit=
"Octets";
break;
1600 case 2 : unit=
"Kio";
break;
1601 case 3 : unit=
"Mio";
break;
1602 case 4 : unit=
"Gio";
break;
1603 case 5 : unit=
"Tio";
break;
1604 default: unit=
"Tio"; i=5;
1606 printf(
"This program will use %d %s of memory\n", (
int)(sum/(1<<((i-1)*10))),unit);
1610 void readCubitMeshAbaqus(
char* fileinp, mesh_t* mesh,
int* number_of_elemnt_block)
1615 char *hexa8=NULL, *hexa27=NULL;
1617 int ielt, inode, itmp;
1620 char *quadf=NULL, *quadp=NULL;
1623 unit_inp = fopen(fileinp,
"r");
1624 if(unit_inp == NULL)
1626 STOP(
"can't open input file (readCubitMeshAbaqus (1)")
1630 mesh->nh = mesh->nq_parax = mesh->nq_surf = 0;
1632 mesh->num_nodes_quad = 4;
1636 while (!feof(unit_inp))
1638 char * cdum = fgets(line, LENMAX, unit_inp);
1641 if (strstr(line,
"NSET=ALLNODES")) mesh->nn = count_elt(unit_inp);
1644 if ((hexa8 = strstr(line,HEXA_8_HDR)) || (hexa27 = strstr(line,HEXA_27_HDR))) {
1646 mesh->num_nodes_hexa = hexa8?8:27;
1648 assert(mesh->num_nodes_hexa == 8);
1649 number_of_elemnt_block[iblock] = count_elt(unit_inp);
1650 mesh->nh += number_of_elemnt_block[iblock++];
1652 STOP(
"unexpected : quads are read before hexa in cubit mesh")
1658 if (strstr(line,QUAD_P_HDR)) {
1659 number_of_elemnt_block[iblock] = count_elt(unit_inp);
1660 mesh->nq_parax += number_of_elemnt_block[iblock++];
1665 if (strstr(line,QUAD_F_HDR)) {
1666 number_of_elemnt_block[iblock] = count_elt(unit_inp);
1667 mesh->nq_surf += number_of_elemnt_block[iblock++];
1675 mesh->ne = mesh->nh + mesh->nq_parax + mesh->nq_surf;
1677 mesh->eptr = MALLOC(idx_t, (mesh->ne+1));
1678 mesh->eind = MALLOC(idx_t, (mesh->nh * mesh->num_nodes_hexa + (mesh->nq_parax + mesh->nq_surf) * mesh->num_nodes_quad));
1679 mesh->layer = MALLOC(
int, mesh->nh);
1680 mesh->ncoords_x = MALLOC(real_t, mesh->nn);
1681 mesh->ncoords_y = MALLOC(real_t, mesh->nn);
1682 mesh->ncoords_z = MALLOC(real_t, mesh->nn);
1683 mesh->types = MALLOC(elt_t, mesh->ne);
1684 mesh->part = MALLOC(idx_t, mesh->nh);
1685 mesh->num_node_per_dim = (int) cbrt(mesh->num_nodes_hexa);
1688 unit_inp = fopen(fileinp,
"r");
1689 if(unit_inp == NULL)
1691 STOP(
"can't open input file (readCubitMeshAbaqus (2)")
1696 while (!feof(unit_inp))
1698 char *cdum = fgets(line, LENMAX, unit_inp);
1701 if (strstr(line,
"NSET=ALLNODES"))
1702 for (inode=0;inode<mesh->nn;inode++) {
1703 int idum = fscanf(unit_inp,
"%d," "%"SCREAL
"," "%"SCREAL
"," "%"SCREAL, &itmp, &mesh->ncoords_x[inode], &mesh->ncoords_y[inode], &mesh->ncoords_z[inode]);
1707 if ((hexa8 = strstr(line,HEXA_8_HDR)) || (hexa27 = strstr(line,HEXA_27_HDR)))
1710 char *hdr = hexa8?HEXA_8_HDR:HEXA_27_HDR;
1711 int layer = atoi(rtrim(strstr(line,hdr) + strlen(hdr)));
1713 for (ielt=0;ielt<number_of_elemnt_block[iblock];ielt++)
1715 int idum = fscanf(unit_inp,
"%d",&itmp);
1716 mesh->eptr[ielt_glo] = loc_eind;
1717 mesh->types[ielt_glo++] = HEXA;
1718 mesh->layer[ihexa++] = layer;
1719 for (inode=0;inode<mesh->num_nodes_hexa;inode++)
1721 int idum = fscanf(unit_inp,
",%d",&mesh->eind[loc_eind]);
1722 mesh->eind[loc_eind++]--;
1730 if ((quadp = strstr(line,QUAD_P_HDR)) || (quadf = strstr(line,QUAD_F_HDR)))
1732 for (ielt=0;ielt<number_of_elemnt_block[iblock];ielt++)
1734 int idum = fscanf(unit_inp,
"%d",&itmp);
1735 mesh->eptr[ielt_glo] = loc_eind;
1736 mesh->types[ielt_glo++] = quadp?QUAD_P:QUAD_F;
1737 for (inode=0;inode<mesh->num_nodes_quad;inode++)
1739 int idum = fscanf(unit_inp,
",%d",&mesh->eind[loc_eind]);
1740 mesh->eind[loc_eind++]--;
1746 mesh->eptr[ielt_glo] = loc_eind;
1748 if (mesh->nh == 0) {
1749 STOP(
"not a valid mesh file");
1754 void readCubitMeshExodus(
char *fileinp, mesh_t *mesh,
int *number_of_elemnt_block)
1756 int cpu_word_size =
sizeof(float);
1757 int io_word_size = 0;
1761 char title[MAX_LINE_LENGTH+1];
1762 int num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets;
1766 char elem_type[MAX_STR_LENGTH+1];
1767 char block_name[MAX_STR_LENGTH+1];
1768 int num_elem_this_blk, num_nodes_per_elem, num_attr;
1777 exoid = ex_open(fileinp, EX_READ, &cpu_word_size, &io_word_size, &version);
1780 res = ex_get_init(exoid, title, &num_dim, &num_nodes, &num_elem, &num_elem_blk, &num_node_sets, &num_side_sets);
1783 idelbs = (
int *) calloc(num_elem_blk,
sizeof(
int));
1784 res = ex_get_elem_blk_ids (exoid, idelbs);
1787 for (
int i=0; i<num_elem_blk; i++) {
1788 res = ex_get_elem_block (exoid, idelbs[i], elem_type, &num_elem_this_blk, &num_nodes_per_elem, &num_attr);
1789 if (!strcmp(elem_type,
"HEX8") || !strcmp(elem_type,
"HEX") || !strcmp(elem_type,
"HEX27")) {
1790 mesh->nh += num_elem_this_blk;
1791 mesh->num_nodes_hexa = num_nodes_per_elem;
1792 mesh->hex27 = (num_nodes_per_elem == 27)?1:0;
1793 }
else if (!strcmp(elem_type,
"SHELL4") || !strcmp(elem_type,
"QUAD4") || !strcmp(elem_type,
"QUAD") || !strcmp(elem_type,
"SHELL9")) {
1794 res = ex_get_name(exoid, EX_ELEM_BLOCK, idelbs[i], block_name);
1795 mesh->num_nodes_quad = num_nodes_per_elem;
1796 if (!strcmp(block_name,
"prx")) {
1798 mesh->nq_parax += num_elem_this_blk;
1799 }
else if (!strcmp(block_name,
"fsu")){
1801 mesh->nq_surf += num_elem_this_blk;
1803 printf(
"ERROR : unknown quad type : %s\n",block_name);
1806 printf(
"block %d : ERROR, bad type : %s\n",i,elem_type);
1812 mesh->nn = num_nodes;
1813 mesh->ne = num_elem;
1815 mesh->layer = MALLOC(
int, mesh->nh);
1816 mesh->ncoords_x = MALLOC(real_t, mesh->nn);
1817 mesh->ncoords_y = MALLOC(real_t, mesh->nn);
1818 mesh->ncoords_z = MALLOC(real_t, mesh->nn);
1819 mesh->types = MALLOC(elt_t, mesh->ne);
1820 mesh->part = MALLOC(idx_t, mesh->nh);
1821 mesh->num_node_per_dim = (int) cbrt(mesh->num_nodes_hexa);
1824 mesh->eptr = MALLOC(idx_t, (mesh->ne+1));
1825 mesh->eind = MALLOC(idx_t, (mesh->nh * 8 + (mesh->nq_parax + mesh->nq_surf) * 4));
1826 mesh->eptr_27 = MALLOC(idx_t, (mesh->ne+1));
1827 mesh->eind_27 = MALLOC(idx_t, (mesh->nh * 27 + (mesh->nq_parax + mesh->nq_surf) * 9));
1829 mesh->eptr = MALLOC(idx_t, (mesh->ne+1));
1830 mesh->eind = MALLOC(idx_t, (mesh->nh * mesh->num_nodes_hexa + (mesh->nq_parax + mesh->nq_surf) * mesh->num_nodes_quad));
1834 assert(mesh->ne == mesh->nh + mesh->nq_parax + mesh->nq_surf);
1837 ex_get_coord(exoid, mesh->ncoords_x, mesh->ncoords_y, mesh->ncoords_z);
1843 int global_offset = 0;
1844 int global_offset_27 = 0;
1845 for (
int iblk=0; iblk<num_elem_blk; iblk++) {
1846 res = ex_get_elem_block (exoid, idelbs[iblk], elem_type, &num_elem_this_blk, &num_nodes_per_elem, &num_attr);
1847 res = ex_get_name(exoid, EX_ELEM_BLOCK, idelbs[iblk], block_name);
1850 connect = (
int *) calloc(num_nodes_per_elem*num_elem_this_blk,
sizeof(
int));
1852 res = ex_get_elem_conn (exoid, idelbs[iblk], connect);
1853 if (!strcmp(elem_type,
"HEX8") || !strcmp(elem_type,
"HEX") || !strcmp(elem_type,
"HEX27")) {
1854 int layer = atoi(&block_name[1]);
1855 for (
int ielem=0; ielem<num_elem_this_blk; ielem++) {
1856 mesh->eptr[ielem_glob] = global_offset;
1858 mesh->eptr_27[ielem_glob] = global_offset_27;
1860 mesh->types[ielem_glob] = HEXA;
1861 mesh->layer[ihexa++] = layer;
1862 for (
int inode=0; inode<num_nodes_per_elem; inode++) {
1865 mesh->eind_27[global_offset_27 + inode] = connect[offset + inode]-1;
1868 if (inode<8) mesh->eind[global_offset + inode] = connect[offset + inode]-1;
1870 offset += num_nodes_per_elem;
1872 global_offset_27 += 27;
1875 global_offset += num_nodes_per_elem;
1879 }
else if (!strcmp(elem_type,
"SHELL4") || !strcmp(elem_type,
"QUAD4") || !strcmp(elem_type,
"QUAD") || !strcmp(elem_type,
"SHELL9")) {
1880 for (
int ielem=0; ielem<num_elem_this_blk; ielem++) {
1881 mesh->eptr[ielem_glob] = global_offset;
1883 mesh->eptr_27[ielem_glob] = global_offset_27;
1885 if (!strcmp(block_name,
"prx")) {
1886 mesh->types[ielem_glob] = QUAD_P;
1887 }
else if (!strcmp(block_name,
"fsu")){
1888 mesh->types[ielem_glob] = QUAD_F;
1890 printf(
"ERROR : unknown quad type : %s\n",block_name);
1892 for (
int inode=0; inode<num_nodes_per_elem; inode++) {
1895 mesh->eind_27[global_offset_27 + inode] = connect[offset + inode]-1;
1898 if (inode<4) mesh->eind[global_offset+inode] = connect[offset + inode]-1;
1900 offset += num_nodes_per_elem;
1902 global_offset_27 += 9;
1905 global_offset += num_nodes_per_elem;
1910 printf(
"block %d : ERROR, bad type : %s\n",iblk,elem_type);
1915 mesh->eptr[ielem_glob] = global_offset;
1916 if (mesh->hex27) mesh->eptr_27[ielem_glob] = global_offset_27;
1923 char* rotateVect(
char* ortn,
char* ret_or,
int cw_quarter_rot)
1942 char Hrot = H>0?2:0;
1943 char Vrot = V>0?3:1;
1944 int nbrot = cw_quarter_rot%4;
1946 Hrot = (4-nbrot+Hrot)&3;
1947 Hsign = (Hrot>>1)?1:-1;
1948 Vrot = (4-nbrot+Vrot)&3;
1949 Vsign = (Vrot>>1)?1:-1;
1952 if (Vrot&1) ret_or[1] = Vsign*abs(V);
1953 else ret_or[0] = Vsign*abs(V);
1955 if (Hrot&1) ret_or[1] = Hsign*abs(H);
1956 else ret_or[0] = Hsign*abs(H);
1961 int findFaceOrientation(
int *connex_nodes,
int num_conn_source,
int num_conn_target)
1966 for (i=0; i<4; i++) {
1967 if (connex_nodes[4] == face2faceRot[num_conn_source][num_conn_target][i]) {
1973 memcpy(or, face_orientation[num_conn_target], 2*
sizeof(
char));
1978 rotateVect(or, or_rot, -rot);
1979 char hsign = or_rot[0]>0?1:0;
1980 char vsign = or_rot[1]>0?1:0;
1981 char h=abs(or_rot[0]);
1982 char v=abs(or_rot[1]);
1983 char valret = (v&3)|(vsign<<2)|((h&3)<<3)|(hsign<<5);
1987 return (
int) valret;
1990 int findEdgeOrientation(
int *connex_nodes,
int num_edge_source,
int num_edge_target)
1993 if (edgeOrder[num_edge_source][0] == connex_nodes[0]) source_order = 1;
1995 if (edgeOrder[num_edge_target][0] == connex_nodes[4]) {
1996 if (source_order)
return 1;
1998 if (!source_order)
return 1;
2005 void add_conn(topo_t typecon, elt_info_t* elt_tab,
int hexa_src,
int numcon_src, idx_t num_neigh,
int numcon_neigh,
int orientation, elt_t type)
2007 conn_info *ptr, *last;
2010 case FACE :
if (elt_tab[hexa_src].faces[numcon_src].defined) {
2011 fprintf(stderr,
"ERROR : face %d of elt %d is already connected\n", numcon_src, hexa_src);
2014 ptr = &elt_tab[hexa_src].faces[numcon_src];
2017 case EDGE :
if (elt_tab[hexa_src].edges[numcon_src].defined) {
2018 for (ptr = &elt_tab[hexa_src].edges[numcon_src]; ptr; ptr = ptr->next) last = ptr;
2019 ptr = last->next = MALLOC(conn_info, 1);
2021 ptr = &elt_tab[hexa_src].edges[numcon_src];
2024 case CORNER :
if (elt_tab[hexa_src].corners[numcon_src].defined) {
2025 for (ptr = &elt_tab[hexa_src].corners[numcon_src]; ptr; ptr = ptr->next) last = ptr;
2026 ptr = last->next = MALLOC(conn_info, 1);
2028 ptr = &elt_tab[hexa_src].corners[numcon_src];
2032 ptr->num_neigh = num_neigh;
2033 ptr->num_conn = numcon_neigh;
2034 ptr->orientation = orientation;
2041 int getnbneigh(topo_t typecon, elt_info_t* elt_tab,
int numcon_src)
2046 case FACE : printf(
"WARNING : funct getnbneigh() should not be called for faces\n");
2049 case EDGE :
if (elt_tab->edges[numcon_src].defined) {
2050 for (ptr = &elt_tab->edges[numcon_src]; ptr; ptr = ptr->next) count++;
2053 case CORNER :
if (elt_tab->corners[numcon_src].defined) {
2054 for (ptr = &elt_tab->corners[numcon_src]; ptr; ptr = ptr->next) count++;
2062 int count_elt(FILE *unit)
2064 const char EOL =
'\n';
2079 char *ltrim(
char *s)
2081 while(isspace(*s)) s++;
2085 char *rtrim(
char *s)
2087 char* back = s + strlen(s);
2088 while(isspace(*--back));
2095 return rtrim(ltrim(s));
void fill_efispec_arrays(info_t *info, mesh_t *mesh, int rank, int *ig_ngll_total, int *ig_nneighbor_all_kind, int *cpu_neighbor, int *ig_cpu_neighbor_info, int *ig_hexa_gnode_glonum, int *ig_quadp_gnode_glonum, int *ig_quadf_gnode_glonum, int *ig_hexa_gll_glonum, int *ig_quadp_gll_glonum, int *ig_quadf_gll_glonum, int *ig_quadp_neighbor_hexa, int *ig_quadp_neighbor_hexaface, int *ig_hexa_material_number)