C $Header: /home/ubuntu/mnt/e9_copy/MITgcm_contrib/sannino/OASIS_3.0_Coupler/pkg/oasis_partition_def.F,v 1.1 2006/07/20 21:08:16 sannino Exp $ C $Name: $ cgm( #include "CPP_EEOPTIONS.h" cgm) cc#include "OASIS_OPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP 0 C !ROUTINE: OASIS_PARTITION_DEF C !INTERFACE: SUBROUTINE OASIS_PARTITION_DEF C !DESCRIPTION: C Routine to ??? da inserire C !USES: c USE mod_kinds_model USE mod_prism_proto USE mod_prism_def_partition_proto c USE mod_prism_put_proto c USE mod_prism_get_proto c USE mod_prism_grids_writing IMPLICIT NONE c #include "SIZE.h" #include "EEPARAMS.h" #include "EESUPPORT.h" #include "PARAMS.h" #include "GRID.h" cgm( #include "OASIS.h" cc#include "OASIS_PARAMS.h" cgm) C !LOCAL VARIABLES: c INTEGER myThid INTEGER, DIMENSION(:), ALLOCATABLE :: il_paral ! Decomposition for each proc INTEGER :: ig_nsegments ! Number of segments of process decomposition INTEGER :: ig_parsize ! Size of array decomposition INTEGER :: ib INTEGER :: iOff, jOff, myOffset CHARACTER(len=80), PARAMETER :: cdec='BOX' ! ! Refer to oasis/psmile/prism/modules/mod_prism_proto.F90 for integer value ! of clim_xxxx parameters ! IF ( .NOT. ll_comparal .AND. mpiMyId.eq.0) THEN ! Monoprocess mitgcm, or parallel mitgcm with only master process involved ! in coupling: the entire field will be exchanged by the process. WRITE(il_mparout,*)'A monoprocess mitgm, or a parallel' WRITE(il_mparout,*)'mitgcm with only the master process' WRITE(il_mparout,*)'involved in the coupling is running' WRITE(il_mparout,*)'' ig_nsegments = 1 ig_parsize = 3 ALLOCATE(il_paral(ig_parsize)) ! il_paral ( clim_strategy ) = clim_serial il_paral ( clim_offset ) = 0 il_paral ( clim_length ) = Nx*Ny il_length = Nx*Ny ! CALL prism_def_partition_proto (il_part_id, il_paral, ierror) DEALLOCATE(il_paral) ! ELSE ! Parallel atm with all process involved in the coupling WRITE(il_mparout,*)'A parallel mitgcm with all processes' WRITE(il_mparout,*)'involved in the coupling is running' WRITE(il_mparout,*)'' ! IF (cdec .EQ. 'APPLE') THEN ! Each process is responsible for a part of field defined by ! the number of grid points and the offset of the first point ! WRITE (il_mparout,*) 'APPLE partitioning' WRITE (il_mparout,*) '' ig_nsegments = 1 ig_parsize = 3 ALLOCATE(il_paral(ig_parsize)) ! IF (mpiMyId .LT. (il_nbcplproc-1)) THEN il_paral ( clim_strategy ) = clim_apple il_paral ( clim_length ) = Nx*Ny/il_nbcplproc il_paral ( clim_offset ) = mpiMyId*(Nx*Ny/il_nbcplproc) ELSE il_paral ( clim_strategy ) = clim_apple il_paral ( clim_length ) = &Nx*Ny-(mpiMyId*(Nx*Ny/il_nbcplproc)) il_paral ( clim_offset ) = &mpiMyId*(Nx*Ny/il_nbcplproc) ENDIF il_length = il_paral(clim_length) ! CALL prism_def_partition_proto (il_part_id, il_paral, ierror) DEALLOCATE(il_paral) ! ELSE IF (cdec .EQ. 'BOX') THEN ! Each process is responsible for a rectangular box (here nPx*nPy ! processors treat sNx*sNy points ! WRITE (il_mparout,*) 'BOX partitioning' WRITE (il_mparout,*) '' ig_nsegments = sNy ig_parsize = 5 ALLOCATE(il_paral(ig_parsize)) c c iOff = mpiMyId / nPy jOff = mod (mpiMyId,nPy) myOffset = (jOff * Nx * sNy) + (iOff * sNx) c------------------------------------------------------- WRITE(il_mparout,*)'ig_parsize',ig_parsize ! il_paral ( clim_strategy ) = clim_box il_paral ( clim_LdX ) = Nx il_paral ( clim_offset ) = myOffset il_paral ( clim_sizeX ) = sNx il_paral ( clim_sizeY ) = sNy il_length = il_paral(clim_sizeX) * il_paral(clim_sizeY) ! CALL prism_def_partition_proto (il_part_id, il_paral, ierror) DEALLOCATE(il_paral) ! ELSE WRITE (il_mparout,*) 'incorrect decomposition ' ENDIF ENDIF WRITE (il_mparout,*) ' End of partition def' WRITE (il_mparout,*) ' --------------------' WRITE (il_mparout,*) '' return end