--- trunk/OOPSE/libmdtools/mpiSimulation_module.F90 2004/05/07 21:35:05 1150 +++ trunk/OOPSE/libmdtools/mpiSimulation_module.F90 2004/05/27 00:48:12 1198 @@ -7,7 +7,7 @@ !! !! @author Charles F. Vardeman II !! @author Matthew Meineke -!! @version $Id: mpiSimulation_module.F90,v 1.12 2004-05-07 21:35:04 gezelter Exp $, $Date: 2004-05-07 21:35:04 $, $Name: not supported by cvs2svn $, $Revision: 1.12 $ +!! @version $Id: mpiSimulation_module.F90,v 1.13 2004-05-27 00:48:12 tim Exp $, $Date: 2004-05-27 00:48:12 $, $Name: not supported by cvs2svn $, $Revision: 1.13 $ module mpiSimulation use definitions @@ -23,10 +23,10 @@ module mpiSimulation public :: gather, scatter public :: setupSimParallel public :: replanSimParallel - public :: getNcol - public :: getNrow - public :: getNcolGroup - public :: getNrowGroup + public :: getNatomsInCol + public :: getNatomsInRow + public :: getNgroupsInCol + public :: getNgroupsInRow public :: isMPISimSet public :: printComponentPlan public :: getMyNode @@ -74,9 +74,12 @@ module mpiSimulation !! Tags used during force loop for parallel simulation - integer, public, allocatable, dimension(:) :: tagLocal - integer, public, allocatable, dimension(:) :: tagRow - integer, public, allocatable, dimension(:) :: tagColumn + integer, public, allocatable, dimension(:) :: AtomLocalToGlobal + integer, public, allocatable, dimension(:) :: AtomRowToGlobal + integer, public, allocatable, dimension(:) :: AtomColToGlobal + integer, public, allocatable, dimension(:) :: GroupLocalToGlobal + integer, public, allocatable, dimension(:) :: GroupRowToGlobal + integer, public, allocatable, dimension(:) :: GroupColToGlobal !! Logical set true if mpiSimulation has been initialized logical, save :: isSimSet = .false. @@ -98,16 +101,16 @@ module mpiSimulation end type gs_plan ! plans for different decompositions - type (gs_plan), public, save :: plan_row - type (gs_plan), public, save :: plan_row3d - type (gs_plan), public, save :: plan_col - type (gs_plan), public, save :: plan_col3d - type (gs_plan), public, save :: plan_row_Rotation - type (gs_plan), public, save :: plan_col_Rotation - type (gs_plan), public, save :: plan_row_Group - type (gs_plan), public, save :: plan_col_Group - type (gs_plan), public, save :: plan_row_Group_3d - type (gs_plan), public, save :: plan_col_Group_3d + type (gs_plan), public, save :: plan_atom_row + type (gs_plan), public, save :: plan_atom_row_3d + type (gs_plan), public, save :: plan_atom_col + type (gs_plan), public, save :: plan_atom_col_3d + type (gs_plan), public, save :: plan_atom_row_Rotation + type (gs_plan), public, save :: plan_atom_col_Rotation + type (gs_plan), public, save :: plan_group_row + type (gs_plan), public, save :: plan_group_col + type (gs_plan), public, save :: plan_group_row_3d + type (gs_plan), public, save :: plan_group_col_3d type (mpiComponentPlan), pointer :: simComponentPlan @@ -137,20 +140,20 @@ contains contains !! Sets up mpiComponentPlan with structure passed from C++. - subroutine setupSimParallel(thisComponentPlan,ntags,tags,status) + subroutine setupSimParallel(thisComponentPlan,nAtomTags,atomTags,status) ! Passed Arguments -! integer, intent(inout) :: nDim !! Number of dimensions !! mpiComponentPlan struct from C type (mpiComponentPlan), intent(inout) :: thisComponentPlan !! Number of tags passed, nlocal - integer, intent(in) :: ntags + integer, intent(in) :: nAtomTags !! Result status, 0 = normal, -1 = error integer, intent(out) :: status integer :: localStatus !! Global reference tag for local particles - integer, dimension(ntags),intent(inout) :: tags + integer, dimension(nAtomTags),intent(inout) :: atomTags - write(*,*) 'mpiSim_mod thinks node', thisComponentPlan%myNode, ' has tags(1) = ', tags(1) + write(*,*) 'mpiSim_mod thinks node', thisComponentPlan%myNode, & + ' has atomTags(1) = ', atomTags(1) status = 0 if (componentPlanSet) then @@ -162,46 +165,46 @@ contains mpiSim = thisComponentPlan write(*,*) "Seting up simParallel" - call make_Force_Grid(mpiSim,localStatus) + call make_Force_Grid(mpiSim, localStatus) if (localStatus /= 0) then write(default_error,*) "Error creating force grid" status = -1 return endif - call updateGridComponents(mpiSim,localStatus) + call updateGridComponents(mpiSim, localStatus) if (localStatus /= 0) then write(default_error,*) "Error updating grid components" status = -1 return - endif - + endif !! initialize gather and scatter plans used in this simulation - call plan_gather_scatter(1,mpiSim%myNlocal,& - mpiSim,mpiSim%rowComm,plan_row) - call plan_gather_scatter(nDim,mpiSim%myNlocal,& - mpiSim,mpiSim%rowComm,plan_row3d) - call plan_gather_scatter(9,mpiSim%myNlocal,& - mpiSim,mpiSim%rowComm,plan_row_Rotation) - call plan_gather_scatter(1,mpiSim%myNgroup,& - mpiSim,mpiSim%rowComm,plan_row_Group) - call plan_gather_scatter(nDim,mpiSim%myNgroup,& - mpiSim,mpiSim%rowComm,plan_row_Group_3d) + call plan_gather_scatter(1, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%rowComm, plan_atom_row) + call plan_gather_scatter(nDim, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%rowComm, plan_atom_row_3d) + call plan_gather_scatter(9, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%rowComm, plan_atom_row_Rotation) + call plan_gather_scatter(1, mpiSim%nGroupsLocal, & + mpiSim, mpiSim%rowComm, plan_group_row) + call plan_gather_scatter(nDim, mpiSim%nGroupsLocal, & + mpiSim, mpiSim%rowComm, plan_group_row_3d) - call plan_gather_scatter(1,mpiSim%myNlocal,& - mpiSim,mpiSim%columnComm,plan_col) - call plan_gather_scatter(nDim,mpiSim%myNlocal,& - mpiSim,mpiSim%columnComm,plan_col3d) - call plan_gather_scatter(9,mpiSim%myNlocal,& - mpiSim,mpiSim%columnComm,plan_col_Rotation) - call plan_gather_scatter(1,mpiSim%myNgroup,& - mpiSim,mpiSim%columnComm,plan_col_Group) - call plan_gather_scatter(nDim,mpiSim%myNgroup,& - mpiSim,mpiSim%columnComm,plan_col_Group_3d) + call plan_gather_scatter(1, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%columnComm, plan_atom_col) + call plan_gather_scatter(nDim, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%columnComm, plan_atom_col_3d) + call plan_gather_scatter(9, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%columnComm, plan_atom_col_Rotation) + call plan_gather_scatter(1, mpiSim%nGroupsLocal, & + mpiSim, mpiSim%columnComm, plan_group_col) + call plan_gather_scatter(nDim, mpiSim%nGroupsLocal, & + mpiSim, mpiSim%columnComm, plan_group_col_3d) ! Initialize tags - call setTags(tags,localStatus) + + call setAtomTags(atomTags,localStatus) if (localStatus /= 0) then status = -1 return @@ -227,41 +230,41 @@ contains endif !! Unplan Gather Scatter plans - call unplan_gather_scatter(plan_row) - call unplan_gather_scatter(plan_row3d) - call unplan_gather_scatter(plan_row_Rotation) - call unplan_gather_scatter(plan_row_Group) - call unplan_gather_scatter(plan_row_Group_3d) + call unplan_gather_scatter(plan_atom_row) + call unplan_gather_scatter(plan_atom_row_3d) + call unplan_gather_scatter(plan_atom_row_Rotation) + call unplan_gather_scatter(plan_group_row) + call unplan_gather_scatter(plan_group_row_3d) - call unplan_gather_scatter(plan_col) - call unplan_gather_scatter(plan_col3d) - call unplan_gather_scatter(plan_col_Rotation) - call unplan_gather_scatter(plan_col_Group) - call unplan_gather_scatter(plan_col_Group_3d) + call unplan_gather_scatter(plan_atom_col) + call unplan_gather_scatter(plan_atom_col_3d) + call unplan_gather_scatter(plan_atom_col_Rotation) + call unplan_gather_scatter(plan_group_col) + call unplan_gather_scatter(plan_group_col_3d) !! initialize gather and scatter plans used in this simulation - call plan_gather_scatter(1,thisComponentPlan%myNlocal,& - thisComponentPlan,thisComponentPlan%rowComm,plan_row) - call plan_gather_scatter(nDim,thisComponentPlan%myNlocal,& - thisComponentPlan,thisComponentPlan%rowComm,plan_row3d) - call plan_gather_scatter(9,thisComponentPlan%myNlocal,& - thisComponentPlan,thisComponentPlan%rowComm,plan_row_Rotation) - call plan_gather_scatter(1,thisComponentPlan%myNgroup,& - thisComponentPlan,thisComponentPlan%rowComm,plan_row_Group) - call plan_gather_scatter(nDim,thisComponentPlan%myNgroup,& - thisComponentPlan,thisComponentPlan%rowComm,plan_row_Group_3d) - - call plan_gather_scatter(1,thisComponentPlan%myNlocal,& - thisComponentPlan,thisComponentPlan%columnComm,plan_col) - call plan_gather_scatter(nDim,thisComponentPlan%myNlocal,& - thisComponentPlan,thisComponentPlan%columnComm,plan_col3d) - call plan_gather_scatter(9,thisComponentPlan%myNlocal,& - thisComponentPlan,thisComponentPlan%columnComm,plan_col_Rotation) - call plan_gather_scatter(1,thisComponentPlan%myNgroup,& - thisComponentPlan,thisComponentPlan%columnComm,plan_col_Group) - call plan_gather_scatter(nDim,thisComponentPlan%myNgroup,& - thisComponentPlan,thisComponentPlan%columnComm,plan_col_Group_3d) - + call plan_gather_scatter(1, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%rowComm, plan_atom_row) + call plan_gather_scatter(nDim, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%rowComm, plan_atom_row_3d) + call plan_gather_scatter(9, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%rowComm, plan_atom_row_Rotation) + call plan_gather_scatter(1, mpiSim%nGroupsLocal, & + mpiSim, mpiSim%rowComm, plan_group_row) + call plan_gather_scatter(nDim, mpiSim%nGroupsLocal, & + mpiSim, mpiSim%rowComm, plan_group_row_3d) + + call plan_gather_scatter(1, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%columnComm, plan_atom_col) + call plan_gather_scatter(nDim, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%columnComm, plan_atom_col_3d) + call plan_gather_scatter(9, mpiSim%nAtomsLocal, & + mpiSim, mpiSim%columnComm, plan_atom_col_Rotation) + call plan_gather_scatter(1, mpiSim%nGroupsLocal, & + mpiSim, mpiSim%columnComm, plan_group_col) + call plan_gather_scatter(nDim, mpiSim%nGroupsLocal, & + mpiSim, mpiSim%columnComm, plan_group_col_3d) + end subroutine replanSimParallel !! Updates number of row and column components for long range forces. @@ -272,43 +275,62 @@ contains !! - 0 Success !! - -1 Failure integer, intent(out) :: status - integer :: nComponentsLocal - integer :: nComponentsRow = 0 - integer :: nComponentsColumn = 0 + integer :: nAtomsLocal + integer :: nAtomsInRow = 0 + integer :: nAtomsInColumn = 0 + integer :: nGroupsLocal + integer :: nGroupsInRow = 0 + integer :: nGroupsInColumn = 0 integer :: mpiErrors status = 0 if (.not. componentPlanSet) return - if (thisComponentPlan%myNlocal == 0 ) then + if (thisComponentPlan%nAtomsLocal == 0) then status = -1 return + endif + if (thisComponentPlan%nGroupsLocal == 0) then + status = -1 + return endif - nComponentsLocal = thisComponentPlan%myNlocal + nAtomsLocal = thisComponentPlan%nAtomsLocal + nGroupsLocal = thisComponentPlan%nGroupsLocal - write(*,*) "UpdateGridComponents: myNlocal ", nComponentsLocal - call mpi_allreduce(nComponentsLocal,nComponentsRow,1,mpi_integer,& - mpi_sum,thisComponentPlan%rowComm,mpiErrors) + call mpi_allreduce(nAtomsLocal, nAtomsInRow, 1, mpi_integer, & + mpi_sum, thisComponentPlan%rowComm, mpiErrors) if (mpiErrors /= 0) then status = -1 return endif - call mpi_allreduce(nComponentsLocal,nComponentsColumn,1,mpi_integer, & - mpi_sum,thisComponentPlan%columnComm,mpiErrors) + call mpi_allreduce(nAtomsLocal, nAtomsInColumn, 1, mpi_integer, & + mpi_sum, thisComponentPlan%columnComm, mpiErrors) + if (mpiErrors /= 0) then + status = -1 + return + endif + + call mpi_allreduce(nGroupsLocal, nGroupsInRow, 1, mpi_integer, & + mpi_sum, thisComponentPlan%rowComm, mpiErrors) if (mpiErrors /= 0) then status = -1 return endif - thisComponentPlan%nComponentsRow = nComponentsRow - thisComponentPlan%nComponentsColumn = nComponentsColumn - write(*,*) "UpdateGridComponents: myNRow ",& - thisComponentPlan%nComponentsRow - write(*,*) "UpdateGridComponents: myNColumn ",& - thisComponentPlan%nComponentsColumn + call mpi_allreduce(nGroupsLocal, nGroupsInColumn, 1, mpi_integer, & + mpi_sum, thisComponentPlan%columnComm, mpiErrors) + if (mpiErrors /= 0) then + status = -1 + return + endif + thisComponentPlan%nAtomsInRow = nAtomsInRow + thisComponentPlan%nAtomsInColumn = nAtomsInColumn + thisComponentPlan%nGroupsInRow = nGroupsInRow + thisComponentPlan%nGroupsInColumn = nGroupsInColumn + end subroutine updateGridComponents @@ -335,7 +357,7 @@ contains !! We make a dangerous assumption here that if numberProcessors is !! zero, then we need to get the information from MPI. - if (thisComponentPlan%numberProcessors == 0 ) then + if (thisComponentPlan%nProcessors == 0 ) then call mpi_comm_size( MPI_COMM_WORLD, nWorldProcessors,mpiErrors) if ( mpiErrors /= 0 ) then status = -1 @@ -348,13 +370,10 @@ contains endif else - nWorldProcessors = thisComponentPlan%numberProcessors + nWorldProcessors = thisComponentPlan%nProcessors myWorldRank = thisComponentPlan%myNode endif - - - nColumnsMax = nint(sqrt(real(nWorldProcessors,kind=dp))) do i = 1, nColumnsMax @@ -365,8 +384,6 @@ contains rowIndex = myWorldRank/nColumns - - call mpi_comm_split(mpi_comm_world,rowIndex,0,rowCommunicator,mpiErrors) if ( mpiErrors /= 0 ) then write(default_error,*) "MPI comm split failed at row communicator" @@ -387,18 +404,16 @@ contains thisComponentPlan%columnComm = columnCommunicator thisComponentPlan%rowIndex = rowIndex thisComponentPlan%columnIndex = columnIndex - thisComponentPlan%numberRows = nRows - thisComponentPlan%numberColumns = nColumns + thisComponentPlan%nRows = nRows + thisComponentPlan%nColumns = nColumns - end subroutine make_Force_Grid - !! initalizes a gather scatter plan - subroutine plan_gather_scatter( nDim,nComponents,thisComponentPlan, & - thisComm, this_plan,status) + subroutine plan_gather_scatter( nDim, nObjects, thisComponentPlan, & + thisComm, this_plan, status) integer, intent(in) :: nDim !! Number of dimensions for gather scatter plan - integer, intent(in) :: nComponents + integer, intent(in) :: nObjects type (mpiComponentPlan), intent(in), target :: thisComponentPlan type (gs_plan), intent(out) :: this_plan !! MPI Component Plan integer, intent(in) :: thisComm !! MPI communicator for this plan @@ -409,10 +424,8 @@ contains integer :: i,junk if (present(status)) status = 0 - - -!! Set gsComponetPlan pointer +!! Set gsComponentPlan pointer !! to the componet plan we want to use for this gather scatter plan. !! WARNING this could be dangerous since thisComponentPlan was origionally !! allocated in C++ and there is a significant difference between c and @@ -420,21 +433,21 @@ contains this_plan%gsComponentPlan => thisComponentPlan ! Set this plan size for displs array. - this_plan%gsPlanSize = nDim * nComponents + this_plan%gsPlanSize = nDim * nObjects ! Duplicate communicator for this plan - call mpi_comm_dup(thisComm,this_plan%myPlanComm,mpi_err) + call mpi_comm_dup(thisComm, this_plan%myPlanComm, mpi_err) if (mpi_err /= 0) then if (present(status)) status = -1 return end if - call mpi_comm_rank(this_plan%myPlanComm,this_plan%myPlanRank,mpi_err) + call mpi_comm_rank(this_plan%myPlanComm, this_plan%myPlanRank, mpi_err) if (mpi_err /= 0) then if (present(status)) status = -1 return end if - call mpi_comm_size(this_plan%myPlanComm,this_plan%planNprocs,mpi_err) + call mpi_comm_size(this_plan%myPlanComm, this_plan%planNprocs, mpi_err) if (mpi_err /= 0) then if (present(status)) status = -1 @@ -464,25 +477,19 @@ contains return end if - !! figure out the total number of particles in this plan this_plan%globalPlanSize = sum(this_plan%counts) - !! initialize plan displacements. this_plan%displs(0) = 0 do i = 1, this_plan%planNprocs - 1,1 this_plan%displs(i) = this_plan%displs(i-1) + this_plan%counts(i-1) end do - - end subroutine plan_gather_scatter - subroutine unplan_gather_scatter(this_plan) type (gs_plan), intent(inout) :: this_plan - this_plan%gsComponentPlan => null() call mpi_comm_free(this_plan%myPlanComm,mpi_err) @@ -500,8 +507,6 @@ contains integer, intent(out), optional :: status integer :: i - - if (present(status)) status = 0 noffset = this_plan%displs(this_plan%myPlanRank) @@ -633,31 +638,30 @@ contains endif end subroutine scatter_double_2d - - - subroutine setTags(tags,status) + + subroutine setAtomTags(tags, status) integer, dimension(:) :: tags integer :: status integer :: alloc_stat - integer :: ncol - integer :: nrow + integer :: nAtomsInCol + integer :: nAtomsInRow status = 0 ! allocate row arrays - nrow = getNrow(plan_row) - ncol = getNcol(plan_col) + nAtomsInRow = getNatomsInRow(plan_atom_row) + nAtomsInCol = getNatomsInCol(plan_atom_col) - if(.not. allocated(tagLocal)) then - allocate(tagLocal(size(tags)),STAT=alloc_stat) + if(.not. allocated(AtomLocalToGlobal)) then + allocate(AtomLocalToGlobal(size(tags)),STAT=alloc_stat) if (alloc_stat /= 0 ) then status = -1 return endif else - deallocate(tagLocal) - allocate(tagLocal(size(tags)),STAT=alloc_stat) + deallocate(AtomLocalToGlobal) + allocate(AtomLocalToGlobal(size(tags)),STAT=alloc_stat) if (alloc_stat /= 0 ) then status = -1 return @@ -665,18 +669,17 @@ contains endif - tagLocal = tags + AtomLocalToGlobal = tags - - if (.not. allocated(tagRow)) then - allocate(tagRow(nrow),STAT=alloc_stat) + if (.not. allocated(AtomRowToGlobal)) then + allocate(AtomRowToGlobal(nAtomsInRow),STAT=alloc_stat) if (alloc_stat /= 0 ) then status = -1 return endif else - deallocate(tagRow) - allocate(tagRow(nrow),STAT=alloc_stat) + deallocate(AtomRowToGlobal) + allocate(AtomRowToGlobal(nAtomsInRow),STAT=alloc_stat) if (alloc_stat /= 0 ) then status = -1 return @@ -684,53 +687,50 @@ contains endif ! allocate column arrays - if (.not. allocated(tagColumn)) then - allocate(tagColumn(ncol),STAT=alloc_stat) + if (.not. allocated(AtomColToGlobal)) then + allocate(AtomColToGlobal(nAtomsInCol),STAT=alloc_stat) if (alloc_stat /= 0 ) then status = -1 return endif else - deallocate(tagColumn) - allocate(tagColumn(ncol),STAT=alloc_stat) + deallocate(AtomColToGlobal) + allocate(AtomColToGlobal(nAtomsInCol),STAT=alloc_stat) if (alloc_stat /= 0 ) then status = -1 return endif endif - call gather(tags,tagRow,plan_row) - call gather(tags,tagColumn,plan_col) - - - end subroutine setTags - -! pure function getNcol(thisplan) result(ncol) - function getNcol(thisplan) result(ncol) + call gather(tags, AtomRowToGlobal, plan_atom_row) + call gather(tags, AtomColToGlobal, plan_atom_col) + + end subroutine setAtomTags + + function getNatomsInCol(thisplan) result(nInCol) type (gs_plan), intent(in) :: thisplan - integer :: ncol - ncol = thisplan%gsComponentPlan%nComponentsColumn - end function getNcol + integer :: nInCol + nInCol = thisplan%gsComponentPlan%nAtomsInColumn + end function getNatomsInCol -! pure function getNrow(thisplan) result(nrow) - function getNrow(thisplan) result(nrow) + function getNatomsInRow(thisplan) result(nInRow) type (gs_plan), intent(in) :: thisplan - integer :: nrow - nrow = thisplan%gsComponentPlan%nComponentsRow - end function getNrow - - function getNcolGroup(thisplan) result(ncol_group) + integer :: nInRow + nInRow = thisplan%gsComponentPlan%nAtomsInRow + end function getNatomsInRow + + function getNgroupsInCol(thisplan) result(nInCol) type (gs_plan), intent(in) :: thisplan - integer :: ncol_group - ncol_group = thisplan%gsComponentPlan%nGroupColumn - end function getNcolGroup + integer :: nInCol + nInCol = thisplan%gsComponentPlan%nGroupsInColumn + end function getNgroupsInCol - function getNrowGroup(thisplan) result(nrow_group) + function getNgroupsInRow(thisplan) result(nInRow) type (gs_plan), intent(in) :: thisplan - integer :: nrow_group - nrow_group = thisplan%gsComponentPlan%nGroupRow - end function getNrowGroup - + integer :: nInRow + nInRow = thisplan%gsComponentPlan%nGroupsInRow + end function getNgroupsInRow + function isMPISimSet() result(isthisSimSet) logical :: isthisSimSet if (isSimSet) then @@ -740,8 +740,6 @@ contains endif end function isMPISimSet - - subroutine printComponentPlan(this_plan,printNode) type (mpiComponentPlan), intent(in) :: this_plan @@ -762,15 +760,15 @@ contains write(default_error,*) "nBondGlobal: ", mpiSim%nBondsGlobal write(default_error,*) "nTorsionsGlobal: ", mpiSim%nTorsionsGlobal write(default_error,*) "nSRIGlobal: ", mpiSim%nSRIGlobal - write(default_error,*) "myNlocal: ", mpiSim%myNlocal + write(default_error,*) "nAtomsLocal: ", mpiSim%nAtomsLocal write(default_error,*) "myNode: ", mpiSim%myNode - write(default_error,*) "numberProcessors: ", mpiSim%numberProcessors + write(default_error,*) "nProcessors: ", mpiSim%nProcessors write(default_error,*) "rowComm: ", mpiSim%rowComm write(default_error,*) "columnComm: ", mpiSim%columnComm - write(default_error,*) "numberRows: ", mpiSim%numberRows - write(default_error,*) "numberColumns: ", mpiSim%numberColumns - write(default_error,*) "nComponentsRow: ", mpiSim%nComponentsRow - write(default_error,*) "nComponentsColumn: ", mpiSim%nComponentsColumn + write(default_error,*) "nRows: ", mpiSim%nRows + write(default_error,*) "nColumns: ", mpiSim%nColumns + write(default_error,*) "nAtomsInRow: ", mpiSim%nAtomsInRow + write(default_error,*) "nAtomsInColumn: ", mpiSim%nAtomsInColumn write(default_error,*) "rowIndex: ", mpiSim%rowIndex write(default_error,*) "columnIndex: ", mpiSim%columnIndex endif