5 #include "../../toolkits/toolkits.h"
6 #include "../../classes/classes.h"
7 #include "../../shared/shared.h"
10 #define MAXCONNECTIVITY 5
12 bool IsVertexInRank(
int* vertices_ranks,
int* vertices_proc_count,
int vid,
int rank){
15 for(
int k=0;k<vertices_proc_count[vid];k++){
24 void AddVertexToRank(
int* vertices_ranks,
int* vertices_proc_count,
int vid,
int rank){
27 if(
IsVertexInRank(vertices_ranks,vertices_proc_count,vid,rank))
return;
30 if(vertices_proc_count[vid]==
MAXCONNECTIVITY)
_error_(
"This vertex is connected to more than "<<
MAXCONNECTIVITY<<
" partition. Either reduce the number of processors, or increase MAXCONNECTIVITY");
32 vertices_proc_count[vid]++;
38 bool control_analysis;
42 iomodel->
FindConstant(&control_analysis,
"md.inversion.iscontrol");
43 iomodel->
FindConstant(&adolc_analysis,
"md.autodiff.isautodiff");
49 if(control_analysis && !adolc_analysis)iomodel->
FetchData(2,
"md.inversion.min_parameters",
"md.inversion.max_parameters");
71 iomodel->
FetchData(2,
"md.mesh.upperelements",
"md.mesh.lowerelements");
80 _error_(
"Mesh not supported yet");
84 iomodel->
DeleteData(6,
"md.mesh.upperelements",
"md.mesh.lowerelements",
"md.inversion.min_parameters",
"md.inversion.max_parameters",
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface");
96 iomodel->
FindConstant(&materials_type,
"md.materials.type");
102 switch(materials_type){
114 _error_(
"Mesh not supported yet");
130 _error_(
"Mesh not supported yet");
146 _error_(
"Mesh not supported yet");
163 _error_(
"Mesh not supported yet");
169 iomodel->
FetchData(&nature,&nnat,&dummy,
"md.materials.nature");
172 for(
int i=0;i<nnat;i++){
174 int temp=nature[nnat-1];
175 nature[nnat-1]=nature[i];
181 for(
int i=0;i<nnat;i++){
194 _error_(
"Mesh not supported yet");
198 iomodel->
FetchData(9,
"md.materials.radius",
"md.materials.viscosity",
"md.materials.lame_lambda",
"md.materials.lame_mu",
"md.materials.burgers_viscosity",
"md.materials.burgers_mu",
"md.materials.isburgers",
"md.materials.issolid",
"md.materials.density");
200 iomodel->
DeleteData(9,
"md.materials.radius",
"md.materials.viscosity",
"md.materials.lame_lambda",
"md.materials.lame_mu",
"md.materials.burgers_viscosity",
"md.materials.burgers_mu",
"md.materials.isburgers",
"md.materials.issolid",
"md.materials.density");
209 for (
int j=0;j<nnat;j++){
218 for(
int j=0;j<elements->
Size();j++){
223 Tria* tria= xDynamicCast<Tria*>(element);
228 _error_(
"Not implemented yet");
248 _error_(
"Mesh not supported yet");
264 _error_(
"Mesh not supported yet");
281 _error_(
"Mesh not supported yet");
291 xDelete<int>(nature);
299 iomodel->
DeleteData(3,
"md.material.rheology_B",
"md.material.rheology_n",
"md.damage.D");
304 int* epart = iomodel->
epart;
309 case TriaEnum: elements_width=3;
break;
328 for(
int j=0;j<elements_width;j++){
330 int vid = iomodel->
elements[elements_width*i+j]-1;
337 int numvertex_pairing;
338 int *vertex_pairing = NULL;
339 iomodel->
FetchData(&vertex_pairing,&numvertex_pairing,NULL,
"md.stressbalance.vertex_pairing");
340 for(
int i=0;i<numvertex_pairing;i++){
341 int id1 = vertex_pairing[2*i+0]-1;
342 int id2 = vertex_pairing[2*i+1]-1;
343 for(
int e=0;e<num_procs;e++){
349 xDelete<int>(vertex_pairing);
350 iomodel->
FetchData(&vertex_pairing,&numvertex_pairing,NULL,
"md.masstransport.vertex_pairing");
351 for(
int i=0;i<numvertex_pairing;i++){
352 int id1 = vertex_pairing[2*i+0]-1;
353 int id2 = vertex_pairing[2*i+1]-1;
354 for(
int e=0;e<num_procs;e++){
360 xDelete<int>(vertex_pairing);
368 vertices_offsets[i] = offset++;
371 vertices_offsets[i] = -1;
376 int* common_send = xNew<int>(num_procs);
377 int* common_recv = xNew<int>(num_procs);
378 int** common_send_ids = xNew<int*>(num_procs);
379 int** common_recv_ids = xNew<int*>(num_procs);
382 for(
int step=0;step<2;step++){
386 for(
int i=0;i<num_procs;i++){
387 _assert_(common_send[i]>=0 && common_recv[i]>=0);
388 common_send_ids[i] = xNew<int>(common_send[i]);
389 common_recv_ids[i] = xNew<int>(common_recv[i]);
394 for(
int i=0;i<num_procs;i++){
403 if(vertices_offsets[i] == -1)
continue;
422 for(
int j=1;j<vertices_proc_count[i];j++){
426 common_send_ids[rank][common_send[rank]] = vertices_offsets[i];
436 common_recv_ids[rank][common_recv[rank]] = vertices_offsets[i];
446 bool isoceancoupling;
447 iomodel->
FindConstant(&isoceancoupling,
"md.transient.isoceancoupling");
449 iomodel->
FetchData(6,
"md.mesh.x",
"md.mesh.y",
"md.mesh.z",
"md.geometry.base",
"md.geometry.thickness",
"md.mask.ice_levelset");
451 if (isoceancoupling) iomodel->
FetchData(2,
"md.mesh.lat",
"md.mesh.long");
454 if(vertices_offsets[i]!=-1){
461 iomodel->
DeleteData(6,
"md.mesh.x",
"md.mesh.y",
"md.mesh.z",
"md.geometry.base",
"md.geometry.thickness",
"md.mask.ice_levelset");
463 if (isoceancoupling) iomodel->
DeleteData(2,
"md.mesh.lat",
"md.mesh.long");
467 if(vertices_offsets[i]!=-1){
473 xDelete<int>(vertices_offsets);
488 xDelete<int>(vertices_ranks);
489 xDelete<int>(vertices_proc_count);