24小时热门版块排行榜    

查看: 1103  |  回复: 5

songjunann

铜虫 (小有名气)

[求助] 帮忙看一下,这两个程序(关于点积的)讲的是什么,为什么要写的这么繁琐

dot.f程序:

  function dot (x,y,n)
cc-begin
c
c-----------------------------------------------------------------------
c
c     dot (x,y,n)
c
c
c     purpose
c     -------
c
c     dot calculates the dot product of the two n-vectors
c     x and y.
c
cc-doc
c     input arguments
c     ---------------
c
c     x       = vector of length n.
c     y       = vector of length n.
c     n       = dimension of x and y.
c
c     output arguments
c     ----------------
c
c     dot     = value of the function, i.e. dot product of x and y.
c
c     notes
c     -----
c
c     1. dot contains a test for n = 0.
c
c-----------------------------------------------------------------------
cc-end
c
      implicit real*8 (a-h,o-z)
      dimension x(*),y(*)
c
      dot = 0.
      if (n .le. 0) return
c      do 100 i = 1,n
c         dot = dot + x(i)*y(i)
c  100 continue
      dot = ddot(n,x,1,y,1)
      end
%%%%%%%%%%%%%%%%%%%%%%%%%
其中ddot.f子程序为:
      DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY)
*     .. Scalar Arguments ..
      INTEGER INCX,INCY,N
*     ..
*     .. Array Arguments ..
      DOUBLE PRECISION DX(*),DY(*)
*     ..
*
*  Purpose
*  =======
*
*     DDOT forms the dot product of two vectors.
*     uses unrolled loops for increments equal to one.
*
*  Further Details
*  ===============
*
*     jack dongarra, linpack, 3/11/78.
*     modified 12/3/93, array(1) declarations changed to array(*)
*
*  =====================================================================
*
*     .. Local Scalars ..
      DOUBLE PRECISION DTEMP
      INTEGER I,IX,IY,M,MP1
*     ..
*     .. Intrinsic Functions ..
      INTRINSIC MOD
*     ..
      DDOT = 0.0d0
      DTEMP = 0.0d0
      IF (N.LE.0) RETURN
      IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN
*
*        code for both increments equal to 1
*
*
*        clean-up loop
*
         M = MOD(N,5)
         IF (M.NE.0) THEN
            DO I = 1,M
               DTEMP = DTEMP + DX(I)*DY(I)
            END DO
            IF (N.LT.5) THEN
               DDOT=DTEMP
            RETURN
            END IF
         END IF
         MP1 = M + 1
         DO I = MP1,N,5
          DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1) +
     $            DX(I+2)*DY(I+2) + DX(I+3)*DY(I+3) + DX(I+4)*DY(I+4)
         END DO
      ELSE
*
*        code for unequal increments or equal increments
*          not equal to 1
*
         IX = 1
         IY = 1
         IF (INCX.LT.0) IX = (-N+1)*INCX + 1
         IF (INCY.LT.0) IY = (-N+1)*INCY + 1
         DO I = 1,N
            DTEMP = DTEMP + DX(IX)*DY(IY)
            IX = IX + INCX
            IY = IY + INCY
         END DO
      END IF
      DDOT = DTEMP
      RETURN
      END

个人感觉不就是两个向量的点积,为什么两个程序要写的这么复杂呢,有什么特别的地方吗,请大家多多指教,谢谢!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖


xzhdty(金币+1): 欢迎常来程序语言看看 2011-09-25 19:19:42
ddot.f 应该是 blas  包中的函数,之所以写成这样,呵呵,或许是受那个时代计算机的计算能力的限制吧,里面有一些手工的向量化操作,呵呵……

在 Fortran 90 后,可以用内置函数dot_product来做这个工作了……
2楼2011-09-25 16:43:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

songjunann

铜虫 (小有名气)

引用回帖:
2楼: Originally posted by snoopyzhao at 2011-09-25 16:43:23:
ddot.f 应该是 blas  包中的函数,之所以写成这样,呵呵,或许是受那个时代计算机的计算能力的限制吧,里面有一些手工的向量化操作,呵呵……

在 Fortran 90 后,可以用内置函数dot_product来做这个工作了……

那在Visual Compaq Fortran里面,混合用F77和F90的语法,不会冲突吧?
3楼2011-09-25 23:09:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

jjdg: 感谢参与 2011-09-27 00:42:46
songjunann(金币+20): 谢谢,再问一个小问题, 2011-09-27 01:00:08
引用回帖:
3楼: Originally posted by songjunann at 2011-09-25 23:09:13:
那在Visual Compaq Fortran里面,混合用F77和F90的语法,不会冲突吧?

应该没有什么问题,但从编程规范的角度来说,不建议这样做……
4楼2011-09-25 23:49:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

songjunann

铜虫 (小有名气)

引用回帖:
3楼: Originally posted by songjunann at 2011-09-25 23:09:13:
那在Visual Compaq Fortran里面,混合用F77和F90的语法,不会冲突吧?

F77里面:
implicit real*8 (a-h,o-z)
dimension a(*),b(*),mdiag(*)
这样的定义用在哪里呢,a,b的大小是动态的吗?
5楼2011-09-27 01:01:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


余泽成(金币+1): 谢谢参与应助! 2011-09-28 10:31:43
引用回帖:
5楼: Originally posted by songjunann at 2011-09-27 01:01:29:
F77里面:
implicit real*8 (a-h,o-z)
dimension a(*),b(*),mdiag(*)
这样的定义用在哪里呢,a,b的大小是动态的吗?

这个不叫动态的,而叫 assumed size array,一般用在子程序中,用以表示 dummy variable 的维度是由实际传递的参数决定的。
6楼2011-09-27 01:28:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 songjunann 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 0817 化学工程 299分求调剂 有科研经历 有二区文章 +13 rare12345 2026-03-18 13/650 2026-03-19 17:30 by jean5056
[考研] 0703化学调剂 ,六级已过,有科研经历 +11 曦熙兮 2026-03-15 11/550 2026-03-19 17:13 by yywzz
[考博] 东华理工大学化材专业26届硕士博士申请 +8 zlingli 2026-03-13 8/400 2026-03-19 16:32 by 轻松不少随
[考研] 304求调剂 +3 曼殊2266 2026-03-18 3/150 2026-03-19 14:42 by peike
[考研] 286求调剂 +6 lemonzzn 2026-03-16 10/500 2026-03-19 14:31 by lemonzzn
[考研] 求调剂,一志愿:南京航空航天大学大学 ,080500材料科学与工程学硕,总分289分 +3 @taotao 2026-03-19 3/150 2026-03-19 14:07 by peike
[考研] 346求调剂[0856] +3 WayneLim327 2026-03-16 6/300 2026-03-19 11:21 by WayneLim327
[考研] 一志愿天大材料与化工(085600)总分338 +5 蔡大美女 2026-03-13 5/250 2026-03-19 10:44 by 是小刘呀~
[考研] 0817调剂 +3 没有答案_ 2026-03-14 3/150 2026-03-19 09:51 by Xu de nuo
[考研] 本科郑州大学物理学院,一志愿华科070200学硕,346求调剂 +4 我不是一根葱 2026-03-18 4/200 2026-03-19 09:11 by 浮云166
[考研] 344求调剂 +6 knight344 2026-03-16 7/350 2026-03-18 20:13 by walc
[考研] 299求调剂 +5 △小透明* 2026-03-17 5/250 2026-03-18 11:49 by 尽舜尧1
[考博] 环境领域全国重点实验室招收博士1-2名 +3 QGZDSYS 2026-03-13 5/250 2026-03-18 11:13 by QGZDSYS
[硕博家园] 湖北工业大学 生命科学与健康学院-课题组招收2026级食品/生物方向硕士 +3 1喜春8 2026-03-17 5/250 2026-03-17 17:18 by ber川cool子
[考研] 290求调剂 +3 p asserby. 2026-03-15 4/200 2026-03-17 16:35 by wangkm
[考研] 一志愿南京大学,080500材料科学与工程,调剂 +4 Jy? 2026-03-16 4/200 2026-03-17 11:02 by gaoqiong
[考研] 考研调剂 +3 淇ya_~ 2026-03-17 5/250 2026-03-17 09:25 by Winj1e
[基金申请] 今年的国基金是打分制吗? 50+3 zhanghaozhu 2026-03-14 3/150 2026-03-16 17:07 by 北京莱茵润色
[考研] 304求调剂 +3 曼殊2266 2026-03-14 3/150 2026-03-16 16:39 by houyaoxu
[考研] 304求调剂 +7 7712b 2026-03-13 7/350 2026-03-13 21:42 by peike
信息提示
请填处理意见