Changeset 27382
- Timestamp:
- 11/10/22 17:21:17 (2 years ago)
- Location:
- issm/trunk-jpl/src/c/classes
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/FemModel.cpp
r27379 r27382 1589 1589 /*Now send and receive vector for nodes on partition edge*/ 1590 1590 IssmDouble **send_buffers = xNewZeroInit<IssmDouble*>(num_procs); 1591 IssmDouble *recv_buffer = xNewZeroInit<IssmDouble>(this->nodes->Size() );1591 IssmDouble *recv_buffer = xNewZeroInit<IssmDouble>(this->nodes->Size(),"t"); //only one alloc, "t" is required by adolc 1592 1592 ISSM_MPI_Request *send_requests = xNew<ISSM_MPI_Request>(num_procs); 1593 1593 for (int rank = 0;rank<num_procs;rank++) send_requests[rank] = ISSM_MPI_REQUEST_NULL; -
issm/trunk-jpl/src/c/classes/Nodes.cpp
r27381 r27382 272 272 273 273 /* Share pids of masters and update pids of clones*/ 274 int* truepids = xNew<int>(this->Size()); //only one alloc 274 int **send_truepids = xNewZeroInit<int*>(num_procs); 275 int *recv_truepids = xNewZeroInit<int>(this->Size()); 276 ISSM_MPI_Request* send_requests = xNew<ISSM_MPI_Request>(num_procs); 277 for(int rank=0;rank<num_procs;rank++) send_requests[rank] = MPI_REQUEST_NULL; 275 278 for(int rank=0;rank<num_procs;rank++){ 276 279 if(this->common_send[rank]){ 277 280 int numids = this->common_send[rank]; 281 send_truepids[rank] = xNew<int>(numids); 278 282 for(int i=0;i<numids;i++){ 279 283 Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(this->common_send_ids[rank][i])); 280 truepids[i] = node->pid;281 } 282 ISSM_MPI_ Send(truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm());284 send_truepids[rank][i] = node->pid; 285 } 286 ISSM_MPI_Isend(send_truepids[rank],numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&send_requests[rank]); 283 287 } 284 288 } … … 286 290 if(this->common_recv[rank]){ 287 291 int numids = this->common_recv[rank]; 288 ISSM_MPI_Recv( truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&status);292 ISSM_MPI_Recv(recv_truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&status); 289 293 for(int i=0;i<numids;i++){ 290 294 Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(this->common_recv_ids[rank][i])); 291 node->pid = truepids[i]; 292 } 293 } 294 } 295 xDelete<int>(truepids); 295 node->pid = recv_truepids[i]; 296 } 297 } 298 } 299 xDelete<int>(recv_truepids); 300 for(int rank=0;rank<num_procs;rank++){ 301 if(rank!=my_rank) ISSM_MPI_Wait(&send_requests[rank],&status); 302 xDelete<int>(send_truepids[rank]); 303 } 304 xDelete<int*>(send_truepids); 305 xDelete<ISSM_MPI_Request>(send_requests); 296 306 297 307 /*4. Distribute G dofs once for all*/ … … 494 504 495 505 /*Now send and receive ug for nodes on partition edge*/ 496 #ifdef _HAVE_AD_497 IssmDouble * buffer = xNew<IssmDouble>(this->Size()*maxdofspernode,"t"); //only one alloc, "t" is required by adolc498 #else499 IssmDouble* buffer = xNew<IssmDouble>(this->Size()*maxdofspernode);500 #endif 506 IssmDouble **send_buffers = xNewZeroInit<IssmDouble*>(num_procs); 507 IssmDouble *recv_buffer = xNewZeroInit<IssmDouble>(this->Size()*maxdofspernode,"t"); 508 ISSM_MPI_Request *send_requests = xNew<ISSM_MPI_Request>(num_procs); 509 for (int rank = 0;rank<num_procs;rank++) send_requests[rank] = ISSM_MPI_REQUEST_NULL; 510 501 511 for(int rank=0;rank<num_procs;rank++){ 502 512 if(this->common_send[rank]){ 503 513 int numids = this->common_send[rank]; 514 send_buffers[rank] = xNew<IssmDouble>(numids*maxdofspernode,"t"); //"t" is required by adolc 504 515 for(int i=0;i<numids;i++){ 505 516 int master_lid = this->common_send_ids[rank][i]; 506 517 Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(master_lid)); 507 518 _assert_(!node->IsClone()); 508 for(int j=0;j<node->gsize;j++) buffer[i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]];509 } 510 ISSM_MPI_ Send(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm());519 for(int j=0;j<node->gsize;j++) send_buffers[rank][i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]]; 520 } 521 ISSM_MPI_Isend(send_buffers[rank],numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&send_requests[rank]); 511 522 } 512 523 } … … 514 525 if(this->common_recv[rank]){ 515 526 int numids = this->common_recv[rank]; 516 ISSM_MPI_Recv( buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status);527 ISSM_MPI_Recv(recv_buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status); 517 528 for(int i=0;i<numids;i++){ 518 529 int master_lid = this->common_recv_ids[rank][i]; 519 530 Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(master_lid)); 520 for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = buffer[i*maxdofspernode+j]; 521 } 522 } 523 } 524 xDelete<IssmDouble>(buffer); 531 for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = recv_buffer[i*maxdofspernode+j]; 532 } 533 } 534 } 535 536 xDelete<IssmDouble>(recv_buffer); 537 for(int rank=0;rank<num_procs;rank++){ 538 if(rank!=my_rank) ISSM_MPI_Wait(&send_requests[rank],&status); 539 xDelete<IssmDouble>(send_buffers[rank]); 540 } 541 xDelete<IssmDouble*>(send_buffers); 542 xDelete<ISSM_MPI_Request>(send_requests); 525 543 526 544 /*Assign output pointer*/
Note:
See TracChangeset
for help on using the changeset viewer.