S Valós D Pontosabb valós C Komplex Z Pontosabb komplexA double precision-os (pontosabb) komplex nincs egyértelmûen definálva a Fortran 77-ben, de a legtöbb fordító elfogadja az alábbi deklarációt:
double complex változók listája complex*16 változók listája
Elõször nézzünk egy egyszerû BLAS segédprogramot, az SSCAL-t
A subroutin meghivása az alábbi:
call SSCAL ( n, a, x, incx )ahol x egy vector, n a vektor hosszúsága (x azon elemeinek száma, amit használni kivánunk). Az incx jelöli a növekményt. Általában az incx=1, ekkor visszakapjuk az eredeti egydimenziós x vektorunkat. Ha incx>1, akkor a kifejezés azt jelenti, hogy mennyit kell ugranunk az x vektor egyes elemei között.Például ha incx=2 , akkor ezt azt jelenti hogy csak minden második elemét kell a vektornak nyújtani (tehát a vektor dimenziójának minimum 2n-1 - nek kell lennie). Ezek ismeretében nézzük az alábbi példát, ahol x -et valós real x(100)alakban deklaráltuk.
call SSCAL(100, a, x, 1) call SSCAL( 50, a, x(50), 1) call SSCAL( 50, a, x(2), 2)Az elsõ sor mind a 100 elemet szorozza a-val. A második sorban már csak az utolsó 50 elemét nyújtja meg a-val. A harmadik sorban lévõ pedig a páros indexû elemeket szorozza.
Fontos tudni, hogy ezzel az utasítással x-et felülírjuk az új értékekkel. Ha szükségünk van az eredeti x-re, másolatot kell róla készítenünk, a SCOPY használatával.
Most tekintsünk egy bonyolultabb esetet is. Tegyük fel, hogy van 2 db kétdimenziós tömbünk (mátrixunk) : A és B. A feladat az A*B szorzás eredményének megadása. A megoldás az, hogy kiszámoljuk A i sorának elemeinek és B j oszlopának elemeinek szorzatát, majd összeadjuk. Erre használhatjuk a BLAS1 segédprogramját az SDOT-ot. A nehézség a helyes indexezésben és a növekményben rejlik. Az SDOT formulizmusa az alábbi:
SDOT ( n, x, incx, y, incy )Tegyük föl, hogy a tömböket az alábbi módon definiáltuk:
real A(lda,lda) real B(ldb,ldb)de a programban az A aktuális mérete m*p, míg B-é p*n. A ideik sora az A(i,1) elemmel kezdõdik. De tudjuk, hogy a Fortran oszlop szerint számol, tehát a következõ A(i,2) elemet lda-ban tárolja átmenetileg (mivel lda az oszlop hosszúság). Ezért incx = lda beállítást alkalmazzuk. B oszlopainál nem áll fent ez a probléma, tehát itt incy = 1. A belsõ produktum hossza p. Tehát a korrekt válasz ez:
SDOT ( p, A(i,1), lda, B(1,j), 1 )
A BLAS subroutine-ok szinte majdnem teljesen maguktól értetõdõek.. Ha tudjuk, hogy melyik routinra van szükségünk, megkeressük és elolvassuk a hozzá tartalmazó leírást, ahol a bemenet és kimenet paraméterek használatát részletesen ismertetik. Majd mi is nézünk erre egy példát a következõ fejezetben, ahol is a LAPACK segédpogramokról lesz szó.
Copyright © 1995-7 by Stanford University. All rights reserved.
Fordították: Seres András Tamás és Szalai Szilvia (ELTE-TTK)