CArl
Code Arlequin / C++ implementation
mesh_tables.cpp
Go to the documentation of this file.
1 #include "mesh_tables.h"
2 
3 // Mesh and weight parameter tables generation
4 void carl::set_weight_function_domain_idx( std::string &filename,
5  int& domain_Idx_BIG,
6  int& nb_of_domain_Idx,
7  std::vector<int>& domain_Idx_micro,
8  std::vector<int>& domain_Idx_coupling
9  )
10 {
11  std::ifstream dataF(filename);
12 
13  // Buffer string
14  std::string bufferLine;
15  std::stringstream dataBuffer;
16 
17  // Read info until the file ends
18  while(std::getline(dataF,bufferLine))
19  {
20  if(bufferLine.compare("$MacroDomainIdx")==0)
21  {
22  dataF >> domain_Idx_BIG;
23  }
24 
25  if(bufferLine.compare("$NbOfMicroDomainIdx")==0)
26  {
27  dataF >> nb_of_domain_Idx;
28 
29  domain_Idx_micro.resize(nb_of_domain_Idx);
30  domain_Idx_coupling.resize(nb_of_domain_Idx);
31  }
32 
33  if(bufferLine.compare("$MicroDomainIdxs")==0)
34  {
35  for(int iii = 0; iii < nb_of_domain_Idx; ++iii )
36  {
37  dataF >> domain_Idx_micro[iii];
38  }
39  }
40 
41  if(bufferLine.compare("$CouplingDomainIdxs")==0)
42  {
43  for(int iii = 0; iii < nb_of_domain_Idx; ++iii )
44  {
45  dataF >> domain_Idx_coupling[iii];
46  }
47  }
48  }
49 
50  dataF.close();
51 }
52 
53 // SERIAL intersection tables generation
54 void carl::generate_intersection_tables_partial( std::string& intersection_table_restrict_B_Filename,
55  std::string& intersection_table_I_Filename,
56  std::unordered_map<int,int>& mesh_restrict_ElemMap,
57  std::unordered_map<int,int>& mesh_micro_ElemMap,
58  std::unordered_map<int,int>& mesh_inter_ElemMap,
59  std::vector<std::pair<int,int> >& intersection_table_restrict_B,
60  std::unordered_multimap<int,int>& intersection_table_I
61  )
62 {
63  std::ifstream table_restrict_B_file(intersection_table_restrict_B_Filename);
64  std::ifstream table_I_file(intersection_table_I_Filename);
65 
66  int nbOfIntersections_restrict_B = -1;
67  int nbOfIntersectionsI = -1;
68  int nbOfTotalTetrasI = -1;
69  int dummyInt = -1;
70  int nbOfTetras = -1;
71  int tetraIdx = -1;
72 
73  int extIdxA = -1;
74  int extIdxB = -1;
75  int extIdxI = -1;
76 
77  table_restrict_B_file >> nbOfIntersections_restrict_B;
78  table_I_file >> nbOfIntersectionsI >> nbOfTotalTetrasI;
79 
80  homemade_assert_msg(nbOfIntersections_restrict_B == nbOfIntersectionsI, "Incompatible intersection table files!");
81 
82  intersection_table_restrict_B.resize(nbOfIntersections_restrict_B);
83  intersection_table_I.reserve(2*nbOfTotalTetrasI);
84 
85  for(int iii = 0; iii < nbOfIntersections_restrict_B; ++iii)
86  {
87  table_restrict_B_file >> dummyInt >> extIdxA >> extIdxB;
88  intersection_table_restrict_B[iii].first = mesh_restrict_ElemMap[extIdxA];
89  intersection_table_restrict_B[iii].second = mesh_micro_ElemMap[extIdxB];
90 
91  table_I_file >> dummyInt >> nbOfTetras;
92  for(int jjj = 0; jjj < nbOfTetras; ++jjj)
93  {
94  table_I_file >> extIdxI;
95  tetraIdx = mesh_inter_ElemMap[extIdxI];
96  intersection_table_I.emplace(dummyInt,tetraIdx);
97  }
98  }
99 
100  table_restrict_B_file.close();
101  table_I_file.close();
102 };
103 
104 void carl::generate_intersection_tables_full( std::string& equivalence_table_restrict_A_Filename,
105  std::string& intersection_table_restrict_B_Filename,
106  std::string& intersection_table_I_Filename,
107  std::unordered_map<int,int>& mesh_restrict_ElemMap,
108  std::unordered_map<int,int>& mesh_micro_ElemMap,
109  std::unordered_map<int,int>& mesh_BIG_ElemMap,
110  std::unordered_map<int,int>& mesh_inter_ElemMap,
111  std::unordered_map<int,int>& equivalence_table_restrict_A,
112  std::vector<std::pair<int,int> >& intersection_table_restrict_B,
113  std::unordered_multimap<int,int>& intersection_table_I
114  )
115 {
116  std::ifstream table_restrict_A_file(equivalence_table_restrict_A_Filename);
117  std::ifstream table_restrict_B_file(intersection_table_restrict_B_Filename);
118  std::ifstream table_I_file(intersection_table_I_Filename);
119 
120  int nbOfEquivalences_restrict_A = -1;
121  int nbOfIntersections_restrict_B = -1;
122  int nbOfIntersectionsI = -1;
123  int nbOfTotalTetrasI = -1;
124  int dummyInt = -1;
125  int nbOfTetras = -1;
126  int tetraIdx = -1;
127 
128  int extIdxA = -1;
129  int extIdxB = -1;
130  int extIdxI = -1;
131  int extIdxR = -1;
132 
133  int idxRestrict = -1;
134  int idxA = -1;
135 
136  table_restrict_A_file >> nbOfEquivalences_restrict_A;
137  std::unordered_map<int,int> temp_equivalence_table_A_restrict(nbOfEquivalences_restrict_A);
138  equivalence_table_restrict_A.reserve(nbOfEquivalences_restrict_A);
139 
140  for(int iii = 0; iii < nbOfEquivalences_restrict_A; ++iii)
141  {
142  table_restrict_A_file >> extIdxR >> extIdxA;
143 
144  idxA = mesh_BIG_ElemMap[extIdxA];
145  idxRestrict = mesh_restrict_ElemMap[extIdxR];
146 
147  temp_equivalence_table_A_restrict[idxA] = idxRestrict;
148  equivalence_table_restrict_A[idxRestrict] = idxA;
149  }
150 
151  table_restrict_B_file >> nbOfIntersections_restrict_B;
152  table_I_file >> nbOfIntersectionsI >> nbOfTotalTetrasI;
153 
154  homemade_assert_msg(nbOfIntersections_restrict_B == nbOfIntersectionsI, "Incompatible intersection table files!");
155 
156  intersection_table_restrict_B.resize(nbOfIntersections_restrict_B);
157  intersection_table_I.reserve(nbOfTotalTetrasI);
158 
159  for(int iii = 0; iii < nbOfIntersections_restrict_B; ++iii)
160  {
161  table_restrict_B_file >> dummyInt >> extIdxA >> extIdxB;
162 
163  idxA = mesh_BIG_ElemMap[extIdxA];
164  intersection_table_restrict_B[iii].first = temp_equivalence_table_A_restrict[idxA];
165  intersection_table_restrict_B[iii].second = mesh_micro_ElemMap[extIdxB];
166 
167  table_I_file >> dummyInt >> nbOfTetras;
168  for(int jjj = 0; jjj < nbOfTetras; ++jjj)
169  {
170  table_I_file >> extIdxI;
171  tetraIdx = mesh_inter_ElemMap[extIdxI];
172  intersection_table_I.emplace(dummyInt,tetraIdx);
173  }
174  }
175 
176  table_restrict_A_file.close();
177  table_restrict_B_file.close();
178  table_I_file.close();
179 };
180 
181 // PARALLEL intersection tables generation
183  const libMesh::Parallel::Communicator& WorldComm,
184  const std::string& intersection_full_table_Filename,
185  const std::string& equivalence_table_A_Filename,
186  const std::string& equivalence_table_B_Filename,
187  std::vector<carl::IntersectionData>& intersection_full_table,
188  std::unordered_map<int,int>& equivalence_table_A_to_R_A,
189  std::unordered_map<int,int>& equivalence_table_B_to_R_B,
190  std::unordered_map<int,int>& equivalence_table_R_A_to_A,
191  std::unordered_map<int,int>& equivalence_table_R_B_to_B
192  )
193 {
194  int rank = WorldComm.rank();
195 
196  // While the equivalence tables are saved as unordered maps, it's easier to
197  // save them as vectors at first, broadcast them, and them reconvert to maps
198  std::vector<int> dummy_equivalence_table_A;
199  std::vector<int> dummy_equivalence_table_B;
200  std::vector<int> dummy_intersection_full_table;
201 
202  int nbOfIntersections = -1;
203  int nbOfInterElems = -1;
204  int nbOfRestricted_A_Elems = -1;
205  int nbOfRestricted_B_Elems = -1;
206 
207  // Do the file reading job on proc 0
208  if(rank == 0)
209  {
210  std::ifstream intersection_full_file(intersection_full_table_Filename);
211 
212  intersection_full_file >> nbOfIntersections >> nbOfInterElems;
213  dummy_intersection_full_table.resize(4*nbOfInterElems);
214 
215  for(int iii = 0; iii < nbOfInterElems; ++iii)
216  {
217  intersection_full_file
218  >> dummy_intersection_full_table[4*iii]
219  >> dummy_intersection_full_table[4*iii + 1]
220  >> dummy_intersection_full_table[4*iii + 2]
221  >> dummy_intersection_full_table[4*iii + 3];
222  }
223  intersection_full_file.close();
224 
225  std::ifstream equivalence_A_file(equivalence_table_A_Filename);
226 
227  equivalence_A_file >> nbOfRestricted_A_Elems;
228  dummy_equivalence_table_A.resize(2*nbOfRestricted_A_Elems);
229 
230  for(int iii = 0; iii < nbOfRestricted_A_Elems; ++iii)
231  {
232  equivalence_A_file >> dummy_equivalence_table_A[2*iii]
233  >> dummy_equivalence_table_A[2*iii + 1];
234  }
235  equivalence_A_file.close();
236 
237  std::ifstream equivalence_B_file(equivalence_table_B_Filename);
238 
239  equivalence_B_file >> nbOfRestricted_B_Elems;
240  dummy_equivalence_table_B.resize(2*nbOfRestricted_B_Elems);
241 
242  for(int iii = 0; iii < nbOfRestricted_B_Elems; ++iii)
243  {
244  equivalence_B_file >> dummy_equivalence_table_B[2*iii]
245  >> dummy_equivalence_table_B[2*iii + 1];
246  }
247  equivalence_B_file.close();
248  }
249 
250  // Broadcast the sizes and resize on other procs
251  WorldComm.broadcast(nbOfIntersections);
252  WorldComm.broadcast(nbOfInterElems);
253  WorldComm.broadcast(nbOfRestricted_A_Elems);
254  WorldComm.broadcast(nbOfRestricted_B_Elems);
255 
256  if(rank != 0)
257  {
258  dummy_intersection_full_table.resize(4*nbOfInterElems);
259  dummy_equivalence_table_A.resize(2*nbOfRestricted_A_Elems);
260  dummy_equivalence_table_B.resize(2*nbOfRestricted_B_Elems);
261  }
262 
263  WorldComm.barrier();
264 
265  WorldComm.broadcast(dummy_intersection_full_table);
266  WorldComm.broadcast(dummy_equivalence_table_A);
267  WorldComm.broadcast(dummy_equivalence_table_B);
268 
269  // Convert back to unoredered maps and pair vectors
270  intersection_full_table.resize(nbOfInterElems);
271  equivalence_table_A_to_R_A.reserve(nbOfRestricted_A_Elems);
272  equivalence_table_B_to_R_B.reserve(nbOfRestricted_B_Elems);
273 
274  equivalence_table_R_A_to_A.reserve(nbOfRestricted_A_Elems);
275  equivalence_table_R_B_to_B.reserve(nbOfRestricted_B_Elems);
276 
277  for(int iii = 0; iii < nbOfInterElems; ++iii)
278  {
279  intersection_full_table[iii].InterMeshIdx
280  = dummy_intersection_full_table[4*iii];
281  intersection_full_table[iii].AMeshIdx
282  = dummy_intersection_full_table[4*iii + 1];
283  intersection_full_table[iii].BMeshIdx
284  = dummy_intersection_full_table[4*iii + 2];
285  intersection_full_table[iii].IntersectionID
286  = dummy_intersection_full_table[4*iii + 3];
287  }
288 
289  for(int iii = 0; iii < nbOfRestricted_A_Elems; ++iii)
290  {
291  equivalence_table_R_A_to_A[dummy_equivalence_table_A[2*iii]] =
292  dummy_equivalence_table_A[2*iii + 1];
293  equivalence_table_A_to_R_A[dummy_equivalence_table_A[2*iii + 1]] =
294  dummy_equivalence_table_A[2*iii];
295  }
296 
297  for(int iii = 0; iii < nbOfRestricted_B_Elems; ++iii)
298  {
299  equivalence_table_R_B_to_B[dummy_equivalence_table_B[2*iii]] =
300  dummy_equivalence_table_B[2*iii + 1];
301  equivalence_table_B_to_R_B[dummy_equivalence_table_B[2*iii + 1]] =
302  dummy_equivalence_table_B[2*iii];
303  }
304 };
305 
307  const libMesh::Parallel::Communicator& WorldComm,
308  const std::string& equivalence_table_A_Filename,
309  const std::string& equivalence_table_B_Filename,
310 
311  std::unordered_map<int,int>& equivalence_table_A_to_R_A,
312  std::unordered_map<int,int>& equivalence_table_B_to_R_B,
313  std::unordered_map<int,int>& equivalence_table_R_A_to_A,
314  std::unordered_map<int,int>& equivalence_table_R_B_to_B )
315 {
316  int rank = WorldComm.rank();
317 
318  // While the equivalence tables are saved as unordered maps, it's easier to
319  // save them as vectors at first, broadcast them, and them reconvert to maps
320  std::vector<int> dummy_equivalence_table_A;
321  std::vector<int> dummy_equivalence_table_B;
322 
323  int nbOfRestricted_A_Elems = -1;
324  int nbOfRestricted_B_Elems = -1;
325 
326  // Read files with proc 0
327  if(rank == 0)
328  {
329  int temp_RX = -1;
330  int temp_X = -1;
331 
332  std::ifstream equivalence_A_file(equivalence_table_A_Filename);
333 
334  equivalence_A_file >> nbOfRestricted_A_Elems;
335  dummy_equivalence_table_A.resize(2*nbOfRestricted_A_Elems);
336 
337  for(int iii = 0; iii < nbOfRestricted_A_Elems; ++iii)
338  {
339  equivalence_A_file >> temp_RX
340  >> temp_X;
341 
342  dummy_equivalence_table_A[2*iii] = temp_RX;
343  dummy_equivalence_table_A[2*iii + 1] = temp_X;
344  }
345  equivalence_A_file.close();
346 
347  std::ifstream equivalence_B_file(equivalence_table_B_Filename);
348 
349  equivalence_B_file >> nbOfRestricted_B_Elems;
350  dummy_equivalence_table_B.resize(2*nbOfRestricted_B_Elems);
351 
352  for(int iii = 0; iii < nbOfRestricted_B_Elems; ++iii)
353  {
354  equivalence_B_file >> temp_RX
355  >> temp_X;
356 
357  dummy_equivalence_table_B[2*iii] = temp_RX;
358  dummy_equivalence_table_B[2*iii + 1] = temp_X;
359  }
360  equivalence_B_file.close();
361  }
362 
363  // Broadcast the sizes and resize on other procs
364  WorldComm.broadcast(nbOfRestricted_A_Elems);
365  WorldComm.broadcast(nbOfRestricted_B_Elems);
366 
367  if(rank != 0)
368  {
369  dummy_equivalence_table_A.resize(2*nbOfRestricted_A_Elems);
370  dummy_equivalence_table_B.resize(2*nbOfRestricted_B_Elems);
371  }
372 
373  WorldComm.barrier();
374 
375  WorldComm.broadcast(dummy_equivalence_table_A);
376  WorldComm.broadcast(dummy_equivalence_table_B);
377 
378  // Convert back to unoredered maps
379  equivalence_table_A_to_R_A.reserve(nbOfRestricted_A_Elems);
380  equivalence_table_B_to_R_B.reserve(nbOfRestricted_B_Elems);
381 
382  equivalence_table_R_A_to_A.reserve(nbOfRestricted_A_Elems);
383  equivalence_table_R_B_to_B.reserve(nbOfRestricted_B_Elems);
384 
385  for(int iii = 0; iii < nbOfRestricted_A_Elems; ++iii)
386  {
387  equivalence_table_R_A_to_A[dummy_equivalence_table_A[2*iii]] =
388  dummy_equivalence_table_A[2*iii + 1];
389  equivalence_table_A_to_R_A[dummy_equivalence_table_A[2*iii + 1]] =
390  dummy_equivalence_table_A[2*iii];
391  }
392 
393  for(int iii = 0; iii < nbOfRestricted_B_Elems; ++iii)
394  {
395  equivalence_table_R_B_to_B[dummy_equivalence_table_B[2*iii]] =
396  dummy_equivalence_table_B[2*iii + 1];
397  equivalence_table_B_to_R_B[dummy_equivalence_table_B[2*iii + 1]] =
398  dummy_equivalence_table_B[2*iii];
399  }
400 }
401 
403  const std::unordered_map<int,std::pair<int,int> >& intersection_pairs_map,
404  const std::unordered_map<int,int>& equivalence_table_A_to_R_A,
405  const std::unordered_map<int,int>& equivalence_table_B_to_R_B,
406  std::unordered_map<int,std::pair<int,int> >& intersection_restricted_pairs_map)
407 {
408  // "Resize" the final output
409  intersection_restricted_pairs_map.reserve(equivalence_table_A_to_R_A.size());
410 
411  int interID = -1;
412  int idxA = -1;
413  int idxB = -1;
414 
415  int idxRA = -1;
416  int idxRB = -1;
417 
418  std::unordered_map<int,std::pair<int,int> >::const_iterator mapIt =
419  intersection_pairs_map.begin();
420  std::unordered_map<int,std::pair<int,int> >::const_iterator end_mapIt =
421  intersection_pairs_map.end();
422 
423  for( ; mapIt != end_mapIt; ++mapIt)
424  {
425  interID = mapIt->first;
426  idxA = mapIt->second.first;
427  idxB = mapIt->second.second;
428 
429  idxRA = equivalence_table_A_to_R_A.at(idxA);
430  idxRB = equivalence_table_B_to_R_B.at(idxB);
431 
432  intersection_restricted_pairs_map[interID] =
433  std::pair<int,int>(idxRA,idxRB);
434  }
435 }
436 
438  const libMesh::Parallel::Communicator& WorldComm,
439  const std::string& intersection_full_table_Filename,
440 
441  std::unordered_map<int,std::pair<int,int> >& full_intersection_pairs_map,
442  std::unordered_map<int,int>& full_intersection_meshI_to_inter_map)
443 {
444  int rank = WorldComm.rank();
445 
446  // While the equivalence tables are saved as unordered maps, it's easier to
447  // save them as vectors at first, broadcast them, and them reconvert to maps
448  std::vector<int> dummy_intersections_IDs;
449  std::vector<int> dummy_intersection_pairs_table;
450  std::vector<int> dummy_all_intersections_table;
451  std::vector<int> dummy_intersections_sizes_table;
452 
453  int nbOfIntersections = -1;
454  int nbOfInterElems = -1;
455 
456  // Declare a few auxiliary variables
457  int temp_interID = -1;
458  int temp_idxA = -1;
459  int temp_idxB = -1;
460  int temp_idxI = -1;
461  int temp_nbOfInter = -1;
462 
463  int interIdx = 0;
464 
465  // Do the file reading job on proc 0
466  if(rank == 0)
467  {
468  std::ifstream intersection_full_file(intersection_full_table_Filename);
469 
470  intersection_full_file >> nbOfIntersections >> nbOfInterElems;
471 
472  dummy_intersections_IDs.resize(nbOfIntersections);
473  dummy_intersection_pairs_table.resize(2*nbOfIntersections);
474  dummy_all_intersections_table.resize(nbOfInterElems);
475  dummy_intersections_sizes_table.resize(nbOfIntersections);
476 
477  for(int iii = 0; iii < nbOfIntersections; ++iii)
478  {
479  // For each line, read ...
480 
481  // ... the inter ID, A and B's elements, and the number of I's elements ...
482  intersection_full_file >> temp_interID
483  >> temp_idxA >> temp_idxB
484  >> temp_nbOfInter;
485 
486  dummy_intersections_IDs[iii] = temp_interID;
487  dummy_intersection_pairs_table[2*iii] = temp_idxA;
488  dummy_intersection_pairs_table[2*iii + 1] = temp_idxB;
489  dummy_intersections_sizes_table[iii] = temp_nbOfInter;
490 
491  // ... and all of I's elements
492  for(int jjj = 0; jjj < temp_nbOfInter; ++jjj)
493  {
494  intersection_full_file >> temp_idxI;
495  dummy_all_intersections_table[interIdx] = temp_idxI;
496 
497  ++interIdx;
498  }
499  }
500  intersection_full_file.close();
501  }
502 
503  // Broadcast the sizes and resize on other procs
504  WorldComm.broadcast(nbOfIntersections);
505  WorldComm.broadcast(nbOfInterElems);
506 
507  if(rank != 0)
508  {
509  dummy_intersections_IDs.resize(nbOfIntersections);
510  dummy_intersection_pairs_table.resize(2*nbOfIntersections);
511  dummy_all_intersections_table.resize(nbOfInterElems);
512  dummy_intersections_sizes_table.resize(nbOfIntersections);
513  }
514 
515  WorldComm.barrier();
516 
517  WorldComm.broadcast(dummy_intersections_IDs);
518  WorldComm.broadcast(dummy_intersection_pairs_table);
519  WorldComm.broadcast(dummy_all_intersections_table);
520  WorldComm.broadcast(dummy_intersections_sizes_table);
521 
522  full_intersection_pairs_map.reserve(nbOfIntersections);
523  full_intersection_meshI_to_inter_map.reserve(nbOfInterElems);
524 
525  interIdx = 0;
526 
527  // Convert the vectors to maps
528  for(int iii = 0; iii < nbOfIntersections; ++iii)
529  {
530  temp_interID = dummy_intersections_IDs[iii];
531  temp_idxA = dummy_intersection_pairs_table[2*iii];
532  temp_idxB = dummy_intersection_pairs_table[2*iii + 1];
533 
534  full_intersection_pairs_map[temp_interID] = std::pair<int,int>(temp_idxA,temp_idxB);
535 
536  temp_nbOfInter = dummy_intersections_sizes_table[iii];
537  for(int jjj = 0; jjj < temp_nbOfInter; ++jjj)
538  {
539  temp_idxI = dummy_all_intersections_table[interIdx];
540  full_intersection_meshI_to_inter_map[temp_idxI] = temp_interID;
541  ++interIdx;
542  }
543  }
544 };
545 
547  const libMesh::Parallel::Communicator& WorldComm,
548  const std::string& intersection_local_table_Filename,
549 
550  std::unordered_map<int,std::pair<int,int> >& local_intersection_pairs_map,
551  std::unordered_map<int,int>& local_intersection_meshI_to_inter_map)
552 {
553  int nbOfIntersections = -1;
554  int nbOfInterElems = -1;
555 
556  // Declare a few auxiliary variables
557  int temp_interID = -1;
558  int temp_idxA = -1;
559  int temp_idxB = -1;
560  int temp_idxI = -1;
561  int temp_nbOfInter = -1;
562  int temp_dummy = -1;
563 
564  int interIdx = 0;
565 
566  // Do the file reading
567  std::ifstream intersection_full_file(intersection_local_table_Filename);
568 
569  intersection_full_file >> nbOfIntersections >> nbOfInterElems >> temp_dummy;
570 
571  for(int iii = 0; iii < nbOfIntersections; ++iii)
572  {
573  // For each line, read ...
574 
575  // ... the inter ID, A and B's elements, and the number of I's elements ...
576  intersection_full_file >> temp_interID
577  >> temp_idxA >> temp_idxB
578  >> temp_nbOfInter;
579 
580  local_intersection_pairs_map[temp_interID] = std::pair<int,int>(temp_idxA,temp_idxB);
581 
582  // ... and all of I's elements
583  for(int jjj = 0; jjj < temp_nbOfInter; ++jjj)
584  {
585  intersection_full_file >> temp_idxI;
586  local_intersection_meshI_to_inter_map[temp_idxI] = temp_interID;
587  ++interIdx;
588  }
589  }
590  intersection_full_file.close();
591 
592  WorldComm.barrier();
593 };
594 
596  const libMesh::Parallel::Communicator& WorldComm,
597  const libMesh::Mesh& mesh_intersection,
598  const std::string& intersection_full_table_Filename,
599  const std::string& equivalence_table_A_Filename,
600  const std::string& equivalence_table_B_Filename,
601 
602  const std::unordered_map<int,int>& equivalence_table_A_to_R_A,
603  const std::unordered_map<int,int>& equivalence_table_B_to_R_B,
604 
605  std::unordered_map<int,std::pair<int,int> >& full_intersection_pairs_map,
606  std::unordered_map<int,std::pair<int,int> >& full_intersection_restricted_pairs_map,
607  std::unordered_map<int,int>& local_intersection_meshI_to_inter_map
608  )
609 {
610  // Start by reading and broadcasting the global intersection table
611  std::unordered_map<int,int> full_intersection_meshI_to_inter_map;
612  set_full_intersection_tables(WorldComm,intersection_full_table_Filename,
613  full_intersection_pairs_map,full_intersection_meshI_to_inter_map);
614 
615  // Set up the restricted intersection pairs table
616  set_restricted_intersection_pairs_table(full_intersection_pairs_map,
617  equivalence_table_A_to_R_A,equivalence_table_B_to_R_B,
618  full_intersection_restricted_pairs_map);
619 
620  // Build in each processor its own intersection table
621  libMesh::MeshBase::const_element_iterator elemIt = mesh_intersection.active_local_elements_begin();
622  const libMesh::MeshBase::const_element_iterator end_elemIt = mesh_intersection.active_local_elements_end();
623  int local_nbOfInters = mesh_intersection.n_active_local_elem();
624  local_intersection_meshI_to_inter_map.reserve(local_nbOfInters);
625 
626  // Some dummy indexes used
627  int idxI_table = -1;
628  int interID = -1;
629 
630  for( ; elemIt != end_elemIt; ++ elemIt)
631  {
632  const libMesh::Elem* elem = *elemIt;
633  idxI_table = elem->id();
634  interID = full_intersection_meshI_to_inter_map[idxI_table];
635  local_intersection_meshI_to_inter_map[idxI_table] = interID;
636  }
637 };
638 
640  const libMesh::Parallel::Communicator& WorldComm,
641  const libMesh::Mesh& mesh_intersection,
642  const std::string& intersection_local_table_Filename,
643  const std::string& equivalence_table_A_Filename,
644  const std::string& equivalence_table_B_Filename,
645 
646  const std::unordered_map<int,int>& equivalence_table_A_to_R_A,
647  const std::unordered_map<int,int>& equivalence_table_B_to_R_B,
648 
649  std::unordered_map<int,std::pair<int,int> >& local_intersection_pairs_map,
650  std::unordered_map<int,std::pair<int,int> >& local_intersection_restricted_pairs_map,
651  std::unordered_map<int,int>& local_intersection_meshI_to_inter_map
652  )
653 {
654  // Start by reading and broadcasting the global intersection table
655  std::unordered_map<int,int> full_intersection_meshI_to_inter_map;
656  read_local_intersection_tables(WorldComm,intersection_local_table_Filename,
657  local_intersection_pairs_map,full_intersection_meshI_to_inter_map);
658 
659  // Set up the restricted intersection pairs table
660  set_restricted_intersection_pairs_table(local_intersection_pairs_map,
661  equivalence_table_A_to_R_A,equivalence_table_B_to_R_B,
662  local_intersection_restricted_pairs_map);
663 
664  // Build in each processor its own intersection table
665  libMesh::MeshBase::const_element_iterator elemIt = mesh_intersection.active_local_elements_begin();
666  const libMesh::MeshBase::const_element_iterator end_elemIt = mesh_intersection.active_local_elements_end();
667  int local_nbOfInters = mesh_intersection.n_active_local_elem();
668  local_intersection_meshI_to_inter_map.reserve(local_nbOfInters);
669 
670  // Some dummy indexes used
671  int idxI_table = -1;
672  int interID = -1;
673 
674  for( ; elemIt != end_elemIt; ++ elemIt)
675  {
676  const libMesh::Elem* elem = *elemIt;
677  idxI_table = elem->id();
678  interID = full_intersection_meshI_to_inter_map[idxI_table];
679  local_intersection_meshI_to_inter_map[idxI_table] = interID;
680  }
681 };
682 
684  const libMesh::Parallel::Communicator& WorldComm,
685  const std::string& intersection_global_table_Filename,
686  const std::unordered_map<int,int>& equivalence_table_system_to_mediator,
687  const std::unordered_map<int,int>& equivalence_table_mediator_to_system,
688 
689  std::unordered_multimap<int,int>& inter_mediator_A,
690  std::unordered_multimap<int,int>& inter_mediator_B)
691 {
692  // First, do the reading work on proc. 0
693  int rank = WorldComm.rank();
694  int nodes = WorldComm.size();
695 
696  int temp_interID;
697  std::vector<int> temp_idxA;
698  std::vector<int> temp_idxB;
699 
700  int nbOfIntersections = -1;
701  int nbOfInterElems = -1;
702 
703  std::string dummy_data;
704 
705  if(rank == 0)
706  {
707  std::ifstream intersection_full_file(intersection_global_table_Filename);
708  intersection_full_file >> nbOfIntersections >> nbOfInterElems;
709 
710  temp_idxA.resize(nbOfIntersections);
711  temp_idxB.resize(nbOfIntersections);
712 
713  for(int iii = 0; iii < nbOfIntersections; ++iii)
714  {
715  // intersection_full_file >> temp_interID
716  // >> temp_idxA[iii] >> temp_idxB[iii];
717  // intersection_full_file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
718  intersection_full_file >> temp_idxA[iii] >> temp_idxB[iii];
719  intersection_full_file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
720  }
721  intersection_full_file.close();
722  }
723 
724  if(nodes > 1)
725  {
726  WorldComm.broadcast(nbOfIntersections);
727 
728  if(rank != 0)
729  {
730  temp_idxA.resize(nbOfIntersections);
731  temp_idxB.resize(nbOfIntersections);
732  }
733  WorldComm.broadcast(temp_idxA);
734  WorldComm.broadcast(temp_idxB);
735  }
736 
737  inter_mediator_A.reserve(nbOfIntersections);
738  inter_mediator_B.reserve(nbOfIntersections);
739 
740  int mediator_idx;
741  for(int iii = 0; iii < nbOfIntersections; ++iii)
742  {
743  mediator_idx = equivalence_table_system_to_mediator.at(temp_idxA[iii]);
744  inter_mediator_B.emplace(std::make_pair(mediator_idx, temp_idxB[iii]));
745  }
746 
747  int system_idx;
748  for(unsigned int iii = 0; iii < equivalence_table_system_to_mediator.size(); ++iii)
749  {
750  system_idx = equivalence_table_mediator_to_system.at(iii);
751  inter_mediator_A.emplace(std::make_pair(iii, system_idx));
752  }
753 };
754 
756  const libMesh::Parallel::Communicator& WorldComm,
757  libMesh::Mesh& mesh_input,
758  libMesh::Mesh& mesh_intersect,
759  std::unordered_map<int,std::pair<int,int> >& local_intersection_pairs_map,
760  bool bUseSecond)
761 {
762  std::vector<double> mesh_input_weights;
763  mesh_input_weights.resize(mesh_input.n_elem(),0);
764 
765  // Nb. of intersections associated to each elem of mesh_intersect
766  std::vector<int> inter_per_elem(mesh_intersect.n_elem());
767 
768  std::unordered_map<int,std::pair<int,int> >::const_iterator inter_pairsIt =
769  local_intersection_pairs_map.begin();
770  const std::unordered_map<int,std::pair<int,int> >::const_iterator end_inter_pairsIt =
771  local_intersection_pairs_map.end();
772  for( ; inter_pairsIt != end_inter_pairsIt; ++inter_pairsIt)
773  {
774  const std::pair<int,int>& dummy_pair = inter_pairsIt->second;
775 
776  if(bUseSecond)
777  {
778  ++inter_per_elem[dummy_pair.first];
779  }
780  else
781  {
782  ++inter_per_elem[dummy_pair.second];
783  }
784  }
785 
786  inter_pairsIt = local_intersection_pairs_map.begin();
787  for( ; inter_pairsIt != end_inter_pairsIt; ++inter_pairsIt)
788  {
789  const std::pair<int,int>& dummy_pair = inter_pairsIt->second;
790 
791  if(bUseSecond)
792  {
793  mesh_input_weights[dummy_pair.second] += inter_per_elem[dummy_pair.first];
794  }
795  else
796  {
797  mesh_input_weights[dummy_pair.first] += inter_per_elem[dummy_pair.second];
798  }
799  }
800 
801  WorldComm.sum(mesh_input_weights);
802 
803  // Basic partitioning
804  libMesh::MeshBase::const_element_iterator mesh_inputIt =
805  mesh_input.elements_begin();
806  const libMesh::MeshBase::const_element_iterator end_mesh_inputIt =
807  mesh_input.elements_end();
808  for( ; mesh_inputIt != end_mesh_inputIt; ++mesh_inputIt )
809  {
810  const libMesh::Elem* elem_input = *mesh_inputIt;
811  int idxinput = elem_input->id();
812 
813  mesh_input_weights[idxinput] += elem_input->n_nodes();
814  }
815 
816  libMesh::ErrorVector dummy_input_error(mesh_input.n_elem());
817  for(unsigned int iii = 0; iii < mesh_input.n_elem(); ++iii)
818  dummy_input_error[iii] = mesh_input_weights[iii];
819 
820  libMesh::Partitioner * dummy_partitioner_input = mesh_input.partitioner().get();
821  dummy_partitioner_input->attach_weights(&dummy_input_error);
822  mesh_input.partition();
823 };
824 
void set_restricted_intersection_pairs_table(const std::unordered_map< int, std::pair< int, int > > &full_intersection_pairs_map, const std::unordered_map< int, int > &equivalence_table_A_to_R_A, const std::unordered_map< int, int > &equivalence_table_B_to_R_B, std::unordered_map< int, std::pair< int, int > > &full_intersection_restricted_pairs_map)
void generate_intersection_tables_full(std::string &equivalence_table_restrict_A_Filename, std::string &intersection_table_restrict_B_Filename, std::string &intersection_table_I_Filename, std::unordered_map< int, int > &mesh_restrict_ElemMap, std::unordered_map< int, int > &mesh_micro_ElemMap, std::unordered_map< int, int > &mesh_BIG_ElemMap, std::unordered_map< int, int > &mesh_inter_ElemMap, std::unordered_map< int, int > &equivalence_table_restrict_A, std::vector< std::pair< int, int > > &intersection_table_restrict_B, std::unordered_multimap< int, int > &intersection_table_I)
void set_local_intersection_tables(const libMesh::Parallel::Communicator &WorldComm, const libMesh::Mesh &mesh_intersection, const std::string &intersection_local_table_Filename, const std::string &equivalence_table_A_Filename, const std::string &equivalence_table_B_Filename, const std::unordered_map< int, int > &equivalence_table_A_to_R_A, const std::unordered_map< int, int > &equivalence_table_B_to_R_B, std::unordered_map< int, std::pair< int, int > > &local_intersection_pairs_map, std::unordered_map< int, std::pair< int, int > > &local_intersection_restricted_pairs_map, std::unordered_map< int, int > &local_intersection_meshI_to_inter_map)
void set_intersection_tables(const libMesh::Parallel::Communicator &WorldComm, const libMesh::Mesh &mesh_intersection, const std::string &intersection_full_table_Filename, const std::string &equivalence_table_A_Filename, const std::string &equivalence_table_B_Filename, const std::unordered_map< int, int > &equivalence_table_A_to_R_A, const std::unordered_map< int, int > &equivalence_table_B_to_R_B, std::unordered_map< int, std::pair< int, int > > &full_intersection_pairs_map, std::unordered_map< int, std::pair< int, int > > &full_intersection_restricted_pairs_map, std::unordered_map< int, int > &local_intersection_meshI_to_inter_map)
void set_weight_function_domain_idx(std::string &filename, int &domain_Idx_BIG, int &nb_of_domain_Idx_micro, std::vector< int > &domain_Idx_micro, std::vector< int > &domain_Idx_coupling)
Definition: mesh_tables.cpp:4
void set_full_intersection_tables(const libMesh::Parallel::Communicator &WorldComm, const std::string &intersection_full_table_Filename, std::unordered_map< int, std::pair< int, int > > &full_intersection_pairs_map, std::unordered_map< int, int > &full_intersection_meshI_to_inter_map)
void build_intersection_and_restriction_tables(const libMesh::Parallel::Communicator &WorldComm, const std::string &intersection_full_table_Filename, const std::string &equivalence_table_A_Filename, const std::string &equivalence_table_B_Filename, std::vector< carl::IntersectionData > &intersection_full_table, std::unordered_map< int, int > &equivalence_table_A_to_R_A, std::unordered_map< int, int > &equivalence_table_B_to_R_B, std::unordered_map< int, int > &equivalence_table_R_A_to_A, std::unordered_map< int, int > &equivalence_table_R_B_to_B)
void set_equivalence_tables(const libMesh::Parallel::Communicator &WorldComm, const std::string &equivalence_table_A_Filename, const std::string &equivalence_table_B_Filename, std::unordered_map< int, int > &equivalence_table_A_to_R_A, std::unordered_map< int, int > &equivalence_table_B_to_R_B, std::unordered_map< int, int > &equivalence_table_R_A_to_A, std::unordered_map< int, int > &equivalence_table_R_B_to_B)
void repartition_system_meshes(const libMesh::Parallel::Communicator &WorldComm, libMesh::Mesh &mesh_input, libMesh::Mesh &mesh_intersect, std::unordered_map< int, std::pair< int, int > > &local_intersection_pairs_map, bool bUseSecond=true)
void read_local_intersection_tables(const libMesh::Parallel::Communicator &WorldComm, const std::string &intersection_local_table_Filename, std::unordered_map< int, std::pair< int, int > > &local_intersection_pairs_map, std::unordered_map< int, int > &local_intersection_meshI_to_inter_map)
void generate_intersection_tables_partial(std::string &intersection_table_restrict_B_Filename, std::string &intersection_table_I_Filename, std::unordered_map< int, int > &mesh_restrict_ElemMap, std::unordered_map< int, int > &mesh_micro_ElemMap, std::unordered_map< int, int > &mesh_inter_ElemMap, std::vector< std::pair< int, int > > &intersection_table_restrict_B, std::unordered_multimap< int, int > &intersection_table_I)
Definition: mesh_tables.cpp:54
#define homemade_assert_msg(asserted, msg)
Definition: common_header.h:63
void set_global_mediator_system_intersection_lists(const libMesh::Parallel::Communicator &WorldComm, const std::string &intersection_global_table_Filename, const std::unordered_map< int, int > &equivalence_table_system_to_mediator, const std::unordered_map< int, int > &equivalence_table_mediator_to_system, std::unordered_multimap< int, int > &inter_mediator_A, std::unordered_multimap< int, int > &inter_mediator_B)