24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 476  |  回复: 2

songjunann

铜虫 (小有名气)

[求助] 求助一个调用程序的问题,谢谢

如下程序,能否在主程序里面这么调用:
Call slvasi(a,b,b,idiag, neq, 1,ierr)
我觉得,有两个b很有问题,但是别人给我的一个大程序就是这么干的,我也不知道如何在大程序里面改,先问问这种调用有问题吗(如没有,我也就放过去了,呵呵)? 非常感谢


subroutine slvasi (a,b,x,mdiag,neq,key,ierr)
cc-begin
c-----------------------------------------------------------------------
c
c     call slvasi (a,b,x,mdiag,neq,key,ierr)
c
c     usage : in-core non-symmetric system
c     =====
c
c
c     purpose
c     -------
c
c     to solve a linear system of equations [a] [x] = , where a
c     is total stiffness matrix
c
cc-doc
c     input arguments
c     ---------------
c
c     a       = vector containing total stiffness matrix.
c     b       = load vector of length neq (see note 1).
c     mdiag   = vector of length neq which contains the position
c               of the diagonal element in the total stiffness
c               matrix.(outputted by diag)
c     neq     = number of equations.
c     key     = operation control key :
c
c               key = 1  perform lu factorisation of a and solve ax = b.
c               key = 2  perform lu factorisation of a only.
c               key = 3  reduction of load vector b and back
c                        substitution to obtain solution x (see note 2).
c     output arguments
c     ----------------
c
c     x       = solution vector of length neq (see note 1).
c     ierr    = error flag (see note 5).
c
c     reference
c     ---------
c
c     LSD / FEM   Version 2.
c     A Library for Software Development in the Finite Element Method
c     Technical Report 85-3, Department of Computer Science
c     The Hebrew University of Jerusalem.
c
c     notes
c     -----
c
c     1.  the vectors b and x can occupy the same storage space i.e. on
c         output b will contain the solution.
c
c     2.  if key = 3 , slvasi must have previously been called with
c         key = 1 or 2. slvasi can be called repeatedly with key = 3,
c         providing a, mdiag and length are not changed.
c
c     3.  slvasi uses the library-supplied function dot(x,y,n) which
c         calculates the inner (dot,scalar) product of the vectors x,y
c         of length n.
c
c     4.  the subroutine slvasi can be used independently of the package
c         presented here. the sole requirement of slvasi is the vectors
c         a,b,mdiag and length written in the described format.
c
c     5.  ierr = 0  execution successfull
c              = n  a zero pivot was encountered on row n during lu
c                   factorisation. factorisation aborted.
c
c-----------------------------------------------------------------------
cc-end
c
      implicit real*8 (a-h,o-z)
      dimension a(*),b(*),x(*),mdiag(*)
c
c
      ierr = 0
      if (key .eq. 3) go to 50
c
c     loop on rows of matrix
c
      mdi = 0
      do 40  i = 1,neq
         mdim  = mdi
         mdi   = mdiag(i)
         lengli= (mdi - mdim - 1)/2
         lengui= mdi - 1 - mdim - lengli
         lowli = i - lengli
         lowui = i - lengui
         loci0 = mdi - lengui - i
         loc0i = mdi - i
         im    = i - 1
         ifj   = min0 (lowui,lowli)
         ilj   = im
         if (ifj .gt. ilj) go to 30
         jj    = ifj - 1
         mdj   = 0
         if (ifj .gt. 1) mdj = mdiag(jj)
c
c        loop on columns.
c
         do 20  j = ifj,ilj
            mdjm  =  mdj
            mdj   =  mdiag(j)
            lenglj=  (mdj - mdjm - 1)/2
            lenguj=  mdj - 1 - mdjm - lenglj
            lowlj =  j - lenglj
            lowuj =  j - lenguj
            if (lowli .gt. j) go to 10
c
c           compute l(i,j)
c
            k       = max0 (lowli,lowuj)
            lockj   = mdj - j + k
            locij   = loci0 + j
            locik   = loci0 + k
            a(locij)= (a(locij) - dot(a(locik),a(lockj),j-k))/a(mdj)
c
c           compute u(j,i)
c
   10       if (lowui .gt. j) go to 20
            k     = max0 (lowui,lowlj)
            locji = loc0i + j
            locki = loc0i + k
            locjk = mdj - lenguj - j + k
            a(locji) = a(locji) - dot(a(locjk),a(locki),j-k)
   20    continue
c
c        compute u(i,i)
c
   30    k      = max0 (lowli,lowui)
         locik  = loci0 + k
         locki  = loc0i + k
         a(mdi) = a(mdi) - dot(a(locik),a(locki),i-k)
         if (a(mdi) .eq. 0.) go to 100
         if (key .eq. 2) go to 40
c
c        reduce b if key = 1
c
         locik = loci0 + lowli
         x(i)  = b(i) - dot (a(locik),x(lowli),i-lowli)
   40 continue
      if (key .eq. 2) return
      go to 70
c
c     reduce b if key = 3
c
   50 mdi   = 0
      do 60 i = 1,neq
         mdim = mdi
         mdi  = mdiag(i)
         lengli= (mdi - mdim - 1)/2
         lowli = i - lengli
         locik = mdim + 1
         x(i)  = b(i) - dot(a(locik),x(lowli),i-lowli)
   60 continue
c
c     back substitution
c
70   ii   = neq
      mdim = mdiag(neq)
      im   = neq
      do 90 ll = 1,neq
         i     = im
         im    = im - 1
         mdi   = mdim
         ii    = ii - 1
         mdim  = 0
         if (i .ne. 1) mdim = mdiag(ii)
         lengli = (mdi - mdim - 1)/2
         lengui = mdi - 1 - mdim - lengli
         lowui  = i - lengui
         x(i)   = x(i)/a(mdi)
         if (lowui .gt.  im) go to 90
         locij  = mdi - lengui
         do 80 j = lowui,im
            x(j) = x(j) - a(locij)*x(i)
            locij= locij + 1
   80    continue
   90 continue
      return
c
c     zero pivot
c
  100 ierr = i
      merf = 100*ierr
      call erfac (4hslva,merf)
      end
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

锐利的碎片

木虫 (正式写手)

star watcher

【答案】应助回帖


jjdg(金币+1): 感谢你的解释 2011-09-18 12:41:33
songjunann(金币+10): xiexie 2011-09-19 09:57:41
应该没什么问题,两个b是因为subroutine slvasi (a,b,x,mdiag,neq,key,ierr) 里x是返回值,如果要把返回的x赋值给b可以这么写。
2楼2011-09-18 10:59:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖


dubo(金币+1): 欢迎讨论 2011-09-18 14:44:03
songjunann(金币+10): 恩,谢谢,我也注意到这个了,只是不确定 2011-09-18 14:57:30
这样做没有什么问题,如果这么调用后,返回值将使得 b 发生变化,从程序来看,这不会有什么问题。但是,如果你想 b 在调用这个子程后不要发生变化,就不能那么调用……

看程序中,有一句话:
c     notes
c     -----
c
c     1.  the vectors b and x can occupy the same storage space i.e. on
c         output b will contain the solution.
3楼2011-09-18 13:31:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 songjunann 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 材料与化工306分找调剂 +13 沧海轻舟e 2026-04-02 13/650 2026-04-02 19:24 by zhouyuwinner
[考研] 265求调剂 +12 林深温澜 2026-04-01 15/750 2026-04-02 19:14 by 一只好果子?
[考研] 342求调剂 +14 Mary Keen 2026-03-28 15/750 2026-04-02 19:07 by asdhh1991
[考研] 求调剂 302分初试 0854 +5 伶可乐 2026-04-02 5/250 2026-04-02 17:53 by 笔落锦州
[考研] 318求调剂 +3 笃行致远. 2026-03-31 4/200 2026-04-02 15:56 by Jaylen.
[考研] 一志愿复旦材料,英一专硕,总分357调剂 +3 1050389037 2026-04-02 4/200 2026-04-02 14:32 by olim
[考研] 085600 295分求调剂 +16 W55j 2026-03-30 19/950 2026-04-02 13:22 by chran16
[考研] 08开头看过来!!! +4 wwwwffffff 2026-03-31 6/300 2026-04-02 11:42 by 均值回归
[考研] 一志愿北交大材料工程总分358 +8 cs0106 2026-04-01 9/450 2026-04-02 10:36 by 不吃魚的貓
[考研] 【求调剂】新能源材料本科,一志愿211,初试321 +6 求调剂学校, 2026-04-02 6/300 2026-04-02 09:41 by 晴空210210
[考研] 266求调剂 +10 阳阳哇塞 2026-04-01 10/500 2026-04-02 09:07 by vgtyfty
[考研] 一志愿南昌大学324求调剂 +12 hanamiko 2026-03-27 12/600 2026-04-01 22:34 by 运气yunqi
[考研] 286求调剂 +16 PolarBear11 2026-03-26 16/800 2026-04-01 21:31 by 七度不信任
[考研] 267求调剂 +13 uiybh 2026-03-31 13/650 2026-04-01 10:25 by 探123
[考研] 326求调剂 +4 崽崽仔 2026-03-31 4/200 2026-04-01 09:58 by 我的船我的海
[考研] 求化学调剂 +12 wulanna 2026-03-28 12/600 2026-03-31 16:38 by 690616278
[考研] 282求调剂 不挑专业 求收留 +4 Yam. 2026-03-30 5/250 2026-03-31 14:41 by 王亮_大连医科大
[考研] 085602化工求调剂(331分) +8 111@127 2026-03-30 8/400 2026-03-30 21:23 by 研究僧导导
[考研] 105500药学求调剂,一志愿山东大学药学,348分 +3 gr哈哈哈 2026-03-28 3/150 2026-03-30 18:56 by 源_2020
[有机交流] 考研调剂 +8 watb 2026-03-26 8/400 2026-03-30 18:40 by 544594351
信息提示
请填处理意见