24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 1118  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿生物与医药,296分,求调剂 +10 66鹿 2026-04-03 12/600 2026-04-06 12:53 by 血荐轩辕123
[考研] 材料与化工专硕306分找合适调剂 +6 沧海轻舟e 2026-04-06 6/300 2026-04-06 10:02 by lqwchd
[考研] 求调剂,一志愿郑州大学材料与化工专硕,英二数二342分,求老师收留 +19 v12abo 2026-04-02 21/1050 2026-04-06 09:29 by 蓝云思雨
[考研] 材料专硕322分 +10 哈哈哈吼吼吼哈 2026-04-04 10/500 2026-04-05 21:22 by 学员8dgXkO
[考研] 0854电子信息319求调剂(接受跨专业调剂) +3 星星不眨眼喽 2026-04-05 3/150 2026-04-05 20:20 by 啵啵啵0119
[考研] 本科211,293分请求调剂 +8 莲菜就是藕吧 2026-04-03 9/450 2026-04-05 19:12 by 蓝云思雨
[有机交流] 甲醇/二氯 1:15过柱子 5+3 a哎y呦w喂 2026-03-31 3/150 2026-04-05 10:42 by 88817753
[考研] 一志愿华中农业大学0710(A)初试329分 求调剂 +4 一名26考研生 2026-04-04 4/200 2026-04-05 10:01 by barlinike
[考研] 283求调剂 +10 A child 2026-04-04 10/500 2026-04-05 08:22 by qlm5820
[考研] 085602调剂 初试总分335 +12 19123253302 2026-04-04 12/600 2026-04-05 08:08 by 544594351
[考研] 085400电子信息319求调剂(接受跨专业调剂) +5 星星不眨眼喽 2026-04-03 6/300 2026-04-04 21:50 by hemengdong
[考研] 调剂 +4 是可乐不是可乐 2026-04-04 4/200 2026-04-04 19:41 by 唐沐儿
[考研] 309分085801求调剂 +11 MY_angel 2026-03-31 11/550 2026-04-04 19:11 by 蓝云思雨
[考研] 278求调剂 +6 Yy7400 2026-04-03 6/300 2026-04-04 09:53 by zhangdingwa
[考研] 286求调剂 +8 lim0922 2026-04-02 8/400 2026-04-03 20:19 by rzh123456
[考研] 282求调剂 +5 呼吸都是减肥 2026-03-31 5/250 2026-04-03 12:03 by 1753564080
[考研] 330求调剂 +3 白神呜呼呼 2026-04-02 3/150 2026-04-03 10:15 by 蓝云思雨
[考研] 环境工程297分求调剂一志愿杭高院 +15 GENJIOW 2026-03-31 16/800 2026-04-02 17:56 by cyh—315
[考研] 求调剂 +7 Aniyaio 2026-04-02 7/350 2026-04-02 16:42 by zzsw+
[考研] 318求调剂 +3 笃行致远. 2026-03-31 4/200 2026-04-02 15:56 by Jaylen.
信息提示
请填处理意见