[cig-commits] r20851 - seismo/3D/FAULT_SOURCE/branches/new_fault_db/src
surendra at geodynamics.org
surendra at geodynamics.org
Thu Oct 18 12:40:57 PDT 2012
Author: surendra
Date: 2012-10-18 12:40:57 -0700 (Thu, 18 Oct 2012)
New Revision: 20851
Modified:
seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/assemble_MPI_vector.f90
seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/compute_forces_elastic.f90
Log:
Fixed issue with assembling routines. Order matters while adding floating point numbers
Modified: seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/assemble_MPI_vector.f90
===================================================================
--- seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/assemble_MPI_vector.f90 2012-10-18 17:09:45 UTC (rev 20850)
+++ seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/assemble_MPI_vector.f90 2012-10-18 19:40:57 UTC (rev 20851)
@@ -244,3 +244,104 @@
endif
end subroutine assemble_MPI_vector_ext_mesh_w
+!-------------------------------------------------------------------------------------------------
+!
+
+ subroutine assemble_MPI_vector_ext_mesh_w_ordered(NPROC,NGLOB_AB,array_val, &
+ buffer_recv_vector_ext_mesh,num_interfaces_ext_mesh,max_nibool_interfaces_ext_mesh, &
+ nibool_interfaces_ext_mesh,ibool_interfaces_ext_mesh, &
+ request_send_vector_ext_mesh,request_recv_vector_ext_mesh,my_neighbours_ext_mesh,myrank)
+
+! waits for data to receive and assembles
+
+ implicit none
+
+ include "constants.h"
+
+! array to assemble
+ real(kind=CUSTOM_REAL), dimension(NDIM,NGLOB_AB) :: array_val
+
+ integer :: NPROC
+ integer :: NGLOB_AB
+
+ real(kind=CUSTOM_REAL), dimension(NDIM,max_nibool_interfaces_ext_mesh,num_interfaces_ext_mesh) :: &
+ buffer_recv_vector_ext_mesh
+
+ integer :: num_interfaces_ext_mesh,max_nibool_interfaces_ext_mesh
+ integer, dimension(num_interfaces_ext_mesh) :: nibool_interfaces_ext_mesh
+ integer, dimension(max_nibool_interfaces_ext_mesh,num_interfaces_ext_mesh) :: ibool_interfaces_ext_mesh
+ integer, dimension(num_interfaces_ext_mesh) :: request_send_vector_ext_mesh,request_recv_vector_ext_mesh
+
+ integer ipoin,iinterface
+
+ !Surendra : for storing values in this processor
+ real(kind=CUSTOM_REAL), dimension(NDIM,max_nibool_interfaces_ext_mesh,num_interfaces_ext_mesh) :: mybuffer
+ integer, dimension(num_interfaces_ext_mesh) :: my_neighbours_ext_mesh
+ logical :: ADDED_mycontri
+ integer :: myrank,iglob,my_iinterface,my_ipoin
+
+
+! here we have to assemble all the contributions between partitions using MPI
+
+! assemble only if more than one partition
+ if(NPROC > 1) then
+
+! wait for communications completion (recv)
+ do iinterface = 1, num_interfaces_ext_mesh
+ call wait_req(request_recv_vector_ext_mesh(iinterface))
+ enddo
+
+! save array_val & equate to zero
+ do iinterface = 1, num_interfaces_ext_mesh
+ do ipoin = 1, nibool_interfaces_ext_mesh(iinterface)
+ mybuffer(:,ipoin,iinterface) = array_val(:,ibool_interfaces_ext_mesh(ipoin,iinterface))
+ array_val(:,ibool_interfaces_ext_mesh(ipoin,iinterface)) = 0._CUSTOM_REAL
+ enddo
+ enddo
+
+
+ ADDED_mycontri = .false.
+! adding contributions of neighbours
+ do iinterface = 1, num_interfaces_ext_mesh
+
+ if(myrank < my_neighbours_ext_mesh(iinterface) .and. .NOT.ADDED_mycontri) then
+ do my_iinterface = 1, num_interfaces_ext_mesh
+ do my_ipoin = 1, nibool_interfaces_ext_mesh(my_iinterface)
+ iglob = ibool_interfaces_ext_mesh(my_ipoin,my_iinterface)
+ array_val(:,iglob) = array_val(:,iglob) + mybuffer(:,my_ipoin,my_iinterface)
+ enddo
+ enddo
+ ADDED_mycontri = .true.
+ endif
+
+ do ipoin = 1, nibool_interfaces_ext_mesh(iinterface)
+ iglob = ibool_interfaces_ext_mesh(ipoin,iinterface)
+ array_val(:,iglob) = array_val(:,iglob) + buffer_recv_vector_ext_mesh(:,ipoin,iinterface)
+ enddo
+ enddo
+
+ if(.NOT.ADDED_mycontri) then
+ do my_iinterface = 1, num_interfaces_ext_mesh
+ do my_ipoin = 1, nibool_interfaces_ext_mesh(my_iinterface)
+ iglob = ibool_interfaces_ext_mesh(my_ipoin,my_iinterface)
+ array_val(:,iglob) = array_val(:,iglob) + mybuffer(:,my_ipoin,my_iinterface)
+ enddo
+ enddo
+ ADDED_mycontri = .true.
+ endif
+
+
+! wait for communications completion (send)
+ do iinterface = 1, num_interfaces_ext_mesh
+ call wait_req(request_send_vector_ext_mesh(iinterface))
+ enddo
+
+ endif
+
+ end subroutine assemble_MPI_vector_ext_mesh_w_ordered
+
+
+!
+!-------------------------------------------------------------------------------------------------
+!
+
Modified: seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/compute_forces_elastic.f90
===================================================================
--- seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/compute_forces_elastic.f90 2012-10-18 17:09:45 UTC (rev 20850)
+++ seismo/3D/FAULT_SOURCE/branches/new_fault_db/src/compute_forces_elastic.f90 2012-10-18 19:40:57 UTC (rev 20851)
@@ -181,19 +181,21 @@
else
! waits for send/receive requests to be completed and assembles values
- call assemble_MPI_vector_ext_mesh_w(NPROC,NGLOB_AB,accel, &
+ call assemble_MPI_vector_ext_mesh_w_ordered(NPROC,NGLOB_AB,accel, &
buffer_recv_vector_ext_mesh,num_interfaces_ext_mesh,&
max_nibool_interfaces_ext_mesh, &
nibool_interfaces_ext_mesh,ibool_interfaces_ext_mesh, &
- request_send_vector_ext_mesh,request_recv_vector_ext_mesh)
+ request_send_vector_ext_mesh,request_recv_vector_ext_mesh, &
+ max_nibool_interfaces_ext_mesh,myrank)
! adjoint simulations
if( SIMULATION_TYPE == 3 ) then
- call assemble_MPI_vector_ext_mesh_w(NPROC,NGLOB_ADJOINT,b_accel, &
+ call assemble_MPI_vector_ext_mesh_w_ordered(NPROC,NGLOB_ADJOINT,b_accel, &
b_buffer_recv_vector_ext_mesh,num_interfaces_ext_mesh,&
max_nibool_interfaces_ext_mesh, &
nibool_interfaces_ext_mesh,ibool_interfaces_ext_mesh, &
- b_request_send_vector_ext_mesh,b_request_recv_vector_ext_mesh)
+ b_request_send_vector_ext_mesh,b_request_recv_vector_ext_mesh, &
+ max_nibool_interfaces_ext_mesh,myrank)
endif !adjoint
endif
More information about the CIG-COMMITS
mailing list