SUBROUTINE SMATVEC( NCOLS, NROWS, NCOFF, N, I, C, U, V ) INTEGER, INTENT(IN ) :: NCOLS ! length of input vector INTEGER, INTENT(IN ) :: NROWS ! length of output vector INTEGER, INTENT(IN ) :: NCOFF ! max number of coefficients INTEGER, INTENT(IN ) :: N( NROWS ) ! number of entries per row INTEGER, INTENT(IN ) :: I( NCOFF ) ! columns list REAL , INTENT(IN ) :: C( NCOFF ) ! coefficient array REAL , INTENT(IN ) :: U( NCOLS ) ! input vector REAL , INTENT( OUT) :: V( NROWS ) ! output vector
SMATVEC()
multiplies input vector U
by
sparse matrix <N,I,C>
and returns the
resulting output vector V
, as is done in area-source
gridding.
C(R) = SUMK=N(R-1)-1N(R) C(K) U(I(K))For Fortran-90 declarations and interface checking:
USE M3UTILIO
See also subroutines
BMATVEC and BILIN, DMATVEC, PMATVEC, and UNGRIDBand programs
MTXBLEND, MTXBUILD, MTXCALC, MTXCPLE.
!! Multiply ABUF(NC1,NR1) by MATX to get ZBUF(NC2,NR2) ... INTEGER :: NR, NC !! for matrix INTEGER :: NR1, NC1 !! for input grid INTEGER :: NR2, NC2 !! for input grid INTEGER, ALLOCATABLE :: MATX(:) INTEGER, ALLOCATABLE :: MCNT(:) REAL, ALLOCATABLE :: ABUF(:,:) REAL, ALLOCATABLE :: ZBUF(:,:) ... !! [Get dimensions (NC1,NR1), (NC2,NR2) for input and output grids] ... IF ( DESC3( MTXFILE ) ) THEN NR = NROWS3D NC = NCOLS3D ... IF ( NR .NE. NC2*NR2 )... !! consistency-check for dimensions ... ALLOCATE( MATX( NR+2*NC ), & MCNT( 0:NR ), & ABUF(NC1,NR1), & ZBUF(NC2,NR2), STAT=ISTAT ) ... IF ( .NOT.READ3( MTXFILE, ALLVAR3, 1,0,0, MATX ) ) ... ... IF ( .NOT.READ3( DATAFILE, 'FOO', 1,0,0, ABUF ) ) ... ... CALL SMATVEC( NC1*NR1, NR, NCOEF, & MATX(1), MATX(NR+1), MATX(NC+NR+1), & ABUF, ZBUF ) ... !! or equivalently, for a time-stepped input: ...
To: Models-3/EDSS I/O API: The Help Pages