123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ! Math and Computer Science Division, Argonne National Laboratory !
- !-----------------------------------------------------------------------
- ! CVS coupler.F90,v 1.6 2006-10-17 21:46:35 jacob Exp
- ! CVS MCT_2_8_0
- !BOP -------------------------------------------------------------------
- !
- ! !ROUTINE: coupler -- coupler for sequential model example
- !
- ! !DESCRIPTION:
- ! A coupler subroutine for sequential climate model example.
- !
- ! !INTERFACE:
- !
- module coupler
- !
- ! !USES:
- !
- ! Get the things needed from MCT by "Use,only" with renaming:
- !
- !---Domain Decomposition Descriptor DataType and associated methods
- use m_GlobalSegMap,only: GlobalSegMap
- !---Field Storage DataType and associated methods
- use m_AttrVect,only : AttrVect
- !---Sparse Matrix DataType and associated methods
- use m_SparseMatrix, only : SparseMatrix
- use m_SparseMatrix, only : SparseMatrix_clean => clean
- use m_SparseMatrix, only : SparseMatrix_init => init
- use m_SparseMatrix, only : SparseMatrix_importGRowInd => &
- importGlobalRowIndices
- use m_SparseMatrix, only : SparseMatrix_importGColInd => &
- importGlobalColumnIndices
- use m_SparseMatrix, only : SparseMatrix_importMatrixElts => &
- importMatrixElements
- use m_SparseMatrixPlus, only : SparseMatrixPlus
- use m_SparseMatrixPlus, only : SparseMatrixPlus_init => init
- use m_SparseMatrixPlus, only : SparseMatrixPlus_clean => clean
- use m_SparseMatrixPlus, only : Xonly ! Decompose matrix by row
- !---Matrix-Vector multiply methods
- use m_MatAttrVectMul, only: MCT_MatVecMul => sMatAvMult
- !---MPEU I/O utilities
- use m_stdio
- use m_ioutil
- implicit none
- private
- ! !PUBLIC MEMBER FUNCTIONS:
- public cplinit
- public cplrun
- public cplfin
- ! !PRIVATE DATA MEMBERS
- type(SparseMatrixPlus) :: Src2DstMatPlus ! the mapping weights
- character(len=*), parameter :: cplname='coupler.F90'
- integer :: rank
- !EOP ___________________________________________________________________
- contains
- !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ! Math and Computer Science Division, Argonne National Laboratory !
- !BOP -------------------------------------------------------------------
- !
- ! !IROUTINE: cplinit - initialize the coupler
- !
- ! !INTERFACE:
- subroutine cplinit(SrcGSMap,DstGSMap,comm,compid)
- ! !INPUT PARAMETERS:
- type(GlobalSegMap),intent(in) :: SrcGSMap,DstGSMap ! GSmaps for source and dst
- integer,intent(in) :: comm ! local MPI communicator
- integer,intent(in) :: compid ! coupler's component ID
- !
- !EOP ___________________________________________________________________
- ! Local variables
- character(len=100),parameter :: &
- RemapMatrixFile='../../data/t42_to_popx1_c_mat.asc'
- ! Loop indicies
- integer :: i,j,k,n
- ! MPI variables
- integer :: nprocs, root, ierr
- ! SparseMatrix variables
- integer :: mdev
- integer :: num_elements, nRows, nColumns
- integer, dimension(2) :: src_dims, dst_dims
- integer, dimension(:), pointer :: rows, columns
- real, dimension(:), pointer :: weights
- ! SparseMatrix elements on root
- type(SparseMatrix) :: sMat
- ! _____________________________________________________________________
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! INITIALIZATION PHASE
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
- ! LOCAL RANK AND SIZE
- call MPI_COMM_RANK(comm,rank,ierr)
- call MPI_COMM_SIZE(comm,nprocs,ierr)
- root = 0
- if(rank==0) write(6,*) cplname,' init start'
- if(rank==0) write(6,*) cplname,' MyID ', compid
- if(rank==0) write(6,*) cplname,' Num procs ', nprocs
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! Read matrix weights for interpolation from a file.
- if (rank == root) then
- mdev = luavail()
- open(mdev, file=trim(RemapMatrixFile), status="old")
- read(mdev,*) num_elements
- read(mdev,*) src_dims(1), src_dims(2)
- read(mdev,*) dst_dims(1), dst_dims(2)
-
- allocate(rows(num_elements), columns(num_elements), &
- weights(num_elements), stat=ierr)
- do n=1, num_elements
- read(mdev,*) rows(n), columns(n), weights(n)
- end do
-
- close(mdev)
- ! Initialize a Sparsematrix
- nRows = dst_dims(1) * dst_dims(2)
- nColumns = src_dims(1) * src_dims(2)
- call SparseMatrix_init(sMat,nRows,nColumns,num_elements)
- call SparseMatrix_importGRowInd(sMat, rows, size(rows))
- call SparseMatrix_importGColInd(sMat, columns, size(columns))
- call SparseMatrix_importMatrixElts(sMat, weights, size(weights))
- deallocate(rows, columns, weights, stat=ierr)
- endif
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! Build a SparseMatrixPlus for doing the interpolation
- ! Specify matrix decomposition to be by row.
- ! following the atmosphere's decomposition.
- call SparseMatrixPlus_init(Src2DstMatPlus, sMat, SrcGSMap, DstGSMap, &
- Xonly, root, comm, compid)
- ! no longer need the matrix defined on root
- if(rank==0) call SparseMatrix_clean(sMat)
- if(rank==0) write(6,*) cplname, ' init done'
- !!! END OF INIT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- end subroutine cplinit
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! RUN PHASE
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ! Math and Computer Science Division, Argonne National Laboratory !
- !BOP -------------------------------------------------------------------
- !
- ! !IROUTINE: cplrun - coupler's run method
- subroutine cplrun(IMPORT,EXPORT)
- ! !INPUT PARAMETERS:
- type(AttrVect),intent(in) :: IMPORT
- type(AttrVect),intent(out) :: EXPORT
- !EOP -------------------------------------------------------------------
- if(rank==0) write(6,*) cplname, ' run start'
- ! Interpolate by doing a parallel sparsematrix-attrvect multiply
- ! Note: this will interpolate all fields with the same names
- call MCT_MatVecMul(IMPORT, Src2DstMatPlus, EXPORT)
- ! possibly do more calculations
- if(rank==0) write(6,*) cplname, ' run done'
- !!! END OF RUN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- end subroutine cplrun
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! FINALIZE PHASE
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ! Math and Computer Science Division, Argonne National Laboratory !
- !BOP -------------------------------------------------------------------
- !
- ! !IROUTINE: cplfin - coupler's finalize method
- subroutine cplfin
- !
- !EOP -------------------------------------------------------------------
- call SparseMatrixPlus_clean(Src2DstMatPlus)
- if(rank==0) write(6,*) cplname, " done"
- end subroutine cplfin
- end module coupler
-
|