声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3535|回复: 1

[Fortran] [推荐]经典PISO算法程序

[复制链接]
发表于 2005-8-2 10:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
  1. C#####################################################################C
  2. C       ME58:269 COMPUTATIONAL FLUID DYNAMICS AND HEAT TRANSFER       C
  3. C                                                                     C
  4. C                                                    C.-L. Lin        C
  5. C#####################################################################C
  6. c234567890123456789012345678901234567890123456789012345678901234567890
  7.       program final_project
  8.       include 'param_piso.f'

  9.       open(unit=2,file='piso_out.plt')
  10.       open(unit=4,file='piso_par.dat')

  11.       call init

  12.       if (lunst) open(unit=5,file='piso_con.plt')
  13.       if (lmoni) open(unit=3,file='piso_mon.plt')

  14. c------------------------------ Beginning of time loop

  15. 1    continue
  16.       time=time+dt
  17.       itim=itim+1

  18. c===================================================================
  19. c                      Outer iteration
  20. c===================================================================

  21.       do iter=1,itermax

  22.       if (lcalcv) call veloc
  23.       if (lcalcp) then
  24.         call press
  25.         call press2
  26.       end if
  27.       if (lcalct) call temps

  28. c------------------------------ check whether u(m)=u(m-1)=u(n+1);
  29.       if (lmoni) write(3,999) iter, (resu(i),i=1,4)
  30. 999   format(i5,4(1pe12.5,1x))
  31.       source=max(resu(1),resu(2),resu(3),resu(4))
  32.       if (source.lt.srmin) go to 20
  33.       if (source.gt.srmax) then
  34.         print *,'iter=', iter,' diveragence with source=',source
  35.         stop
  36.       end if

  37.       end do

  38. 20   continue

  39. c===================================================================
  40. c check whether u(n+1)=u(n), steady solutions
  41. c===================================================================  
  42.       if (lunst) then
  43.         rest(1)=0.
  44.         rest(2)=0.
  45.         rest(3)=0.         
  46.        do i=2,nxm
  47.        do ij=li(i)+2,li(i)+nym
  48.         rest(1)=rest(1)+abs(u(ij)-uo(ij))                     
  49.         rest(2)=rest(2)+abs(v(ij)-vo(ij))                     
  50.         rest(3)=rest(3)+abs(t(ij)-to(ij))
  51.        end do
  52.        end do
  53.         rest(1)=rest(1)*fnxy
  54.         rest(2)=rest(2)*fnxy
  55.         rest(3)=rest(3)*fnxy
  56.         write(5,999) itim, time, (rest(i),i=1,3)
  57.       end if

  58.       if (itim.gt.itimmax) go to 30

  59. c===================================================================  
  60. c assign new solutions <u, v, t> to <uo, vo, to>
  61. c and start a new iteration if necessary.
  62. c===================================================================
  63.       do ij=1,nxy
  64.          uo(ij)=u(ij)
  65.          vo(ij)=v(ij)
  66.          to(ij)=t(ij)
  67.       end do

  68. c-- begins a new time step
  69.       go to 1
  70. c===================================================================

  71. 30   continue

  72. c------------------------------ output
  73.       write(2,*) 'VARIABLES="x" "y" "u" "v" "p" "t"'
  74.       write(2,*) 'ZONE F=POINT,I=',nxm2,',J=',nym2     
  75.       do i=2,nxm
  76.       do j=2,nym
  77.         ij=li(i)+j
  78.         write(2,9999) (i-2)*dx,(j-2)*dy,u(ij),v(ij),p(ij),t(ij)
  79. 9999        format(2(f8.4,1x),4(E12.5,1x))
  80.       end do
  81.       end do

  82.       stop
  83.       end

  84. C#####################################################################C
  85.       subroutine init
  86.       include 'param_piso.f'
  87. C#####################################################################C
  88. c234567890123456789012345678901234567890123456789012345678901234567890

  89.       time=0.0
  90.       itim=0
  91. c
  92. c parameters: rho, density; vis, viscosity; prm, Prandtl number
  93. c             grav, gravity; beta, coef of thermal expansion.
  94. c
  95.       rho=1.0
  96.       vis=1.e-3
  97.       prm=0.1
  98.       alpha=vis/prm
  99.       grav=0.
  100. c beta=1/rho*(d\rho/dt). No minus sign. Be careful about the source term
  101. c in y-momentum equation.
  102.       beta=0.
  103.       th=0.
  104.       tc=0.
  105.       tref=0.
  106.       ulid=1.
  107.       xl=1.0
  108.       yl=1.0
  109.       dt=1.E20

  110.       ipiso=1

  111.       if (ipiso.eq.0) then
  112. c -----SIMPLE
  113.       urf(1)=0.8
  114.       urf(2)=0.8
  115.       urf(3)=0.2
  116.       urf(4)=0.9
  117.       else
  118. c -----PISO
  119.       urf(1)=0.8
  120.       urf(2)=0.8
  121.       urf(3)=1.0
  122.       urf(4)=1.0
  123.       end if

  124.       dx  = xl/float(nxm2)
  125.       dy  = yl/float(nym2)
  126.       vol = dx*dy
  127.       vdydx=vis*dy/dx
  128.       vdxdy=vis*dx/dy
  129.       adydx=vdydx/prm
  130.       adxdy=vdxdy/prm

  131.       lcalcv=.true.
  132.       lcalcp=.true.
  133.       lcalct=.false.
  134.       lmoni =.false.
  135.       lunst =.false.

  136.       apt=0.
  137.       if (lunst) apt=vol/dt

  138.       srmax=1.e+3
  139.       srmin=1.e-4
  140.       fnxy=1./float(nxm2)/float(nym2)
  141.       do i=1,4
  142.          resu(i)=0.
  143.       end do

  144.       do i=1,nx
  145.          li(i)=(i-1)*ny
  146.       end do

  147. c===================================================================
  148. c dimensionless parameter
  149. c===================================================================
  150.       re=ulid*yl/vis
  151.       rei=1./re
  152.       gr=grav*beta*(th-tc)*yl**3/vis**2
  153.       ra=gr*prm
  154.       grre=gr/re/re
  155.       prre=1./re/pr
  156. c234567890123456789012345678901234567890123456789012345678901234567890

  157.       write(4,777)re,gr,ra,prm
  158. 777   format('Re =',1pe12.5,' Gr=',1pe12.5,' Ra=',1pe12.5,
  159.      &   ' Pr=',1pe12.5)
  160.       
  161. c===================================================================     
  162. c initial fields
  163. c===================================================================
  164.       uin=0.
  165.       vin=0.
  166.       pin=0.
  167.       tin=0.
  168.       
  169.       do ij=1,nxy
  170.          u(ij) =uin
  171.          v(ij) =vin
  172.          p(ij) =pin
  173.          t(ij) =tin
  174.          uo(ij)=uin
  175.          vo(ij)=vin
  176.          to(ij)=tin
  177.       end do

  178.       do ij=1,nxy
  179.          ae1(ij)=0.
  180.          aw1(ij)=0.
  181.          an1(ij)=0.
  182.          as1(ij)=0.
  183.          ae2(ij)=0.
  184.          aw2(ij)=0.
  185.          an2(ij)=0.
  186.          as2(ij)=0.
  187.          ae3(ij)=0.
  188.          aw3(ij)=0.
  189.          an3(ij)=0.
  190.          as3(ij)=0.
  191.        uprime(ij)=0.
  192.        vprime(ij)=0.
  193.        utilde(ij)=0.
  194.        vtilde(ij)=0.
  195.          flxe(ij)=0.
  196.          flxw(ij)=0.
  197.          flxn(ij)=0.
  198.          flxs(ij)=0.
  199.          flxe2(ij)=0.
  200.          flxw2(ij)=0.
  201.          flxn2(ij)=0.
  202.          flxs2(ij)=0.
  203.          su(ij)=0.
  204.          sv(ij)=0.
  205.          apu(ij)=0.
  206.          apv(ij)=0.
  207.       end do

  208.       do i=2,nxm
  209.       do j=2,nym
  210.          ij=li(i)+j
  211.          flxe(ij)=+0.5*(u(ij)+u(ij+ny))*dy
  212.          flxw(ij)=-0.5*(u(ij)+u(ij-ny))*dy
  213.          flxn(ij)=+0.5*(v(ij)+v(ij+1) )*dx
  214.          flxs(ij)=-0.5*(v(ij)+v(ij-1) )*dx
  215.       end do
  216.       end do

  217. c====================================================================
  218. c assign values to fictitious nodes according to boundary conditions.
  219. c====================================================================
  220.       do i=2,nxm
  221.          ij=li(i)+ny
  222.          u(ij)=2.*ulid-u(ij-1)
  223. c         uo(ij)=u(ij)
  224.       end do

  225.       do j=2,nym
  226. c isothermal wall
  227.          ij=li(1)+j
  228.          t(ij)=2.*tc-t(ij+ny)
  229. c         to(ij)=t(ij)

  230.          ij=li(nx)+j
  231.          t(ij)=2.*th-t(ij-ny)
  232. c         to(ij)=t(ij)
  233.       end do
  234. c
  235.       return
  236.       end

  237. C#####################################################################C
  238.       subroutine veloc
  239.       include 'param_piso.f'
  240. C#####################################################################C
  241. c234567890123456789012345678901234567890123456789012345678901234567890
  242. c
  243.       do i=2,nxm
  244.       do j=2,nym
  245.          ij=li(i)+j
  246.          dpx(ij)=(0.5*(p(ij+ny)+p(ij))-0.5*(p(ij)+p(ij-ny)))/dx
  247.          dpy(ij)=(0.5*(p(ij+1) +p(ij))-0.5*(p(ij)+p(ij-1) ))/dy
  248.       end do
  249.       end do

  250.       do i=2,nxm
  251.       do ij=li(i)+2,li(i)+nym

  252.          cemin=min(flxe(ij),0)
  253.          cwmin=min(flxw(ij),0)
  254.          cnmin=min(flxn(ij),0)
  255.          csmin=min(flxs(ij),0)
  256.          cemax=max(flxe(ij),0)
  257.          cwmax=max(flxw(ij),0)
  258.          cnmax=max(flxn(ij),0)
  259.          csmax=max(flxs(ij),0)

  260.          ae1(ij)=cemin-vdydx
  261.          aw1(ij)=cwmin-vdydx
  262.          an1(ij)=cnmin-vdxdy
  263.          as1(ij)=csmin-vdxdy

  264.          ae2(ij)= ae1(ij)
  265.          aw2(ij)= aw1(ij)
  266.          an2(ij)= an1(ij)
  267.          as2(ij)= as1(ij)

  268. c234567890123456789012345678901234567890123456789012345678901234567890
  269.          su(ij)= apt*uo(ij) - dpx(ij)*vol
  270.      &     +cemin*u(ij+ny)+cemax*u(ij)-flxe(ij)*0.5*(u(ij+ny)+u(ij))
  271.      &     +cwmin*u(ij-ny)+cwmax*u(ij)-flxw(ij)*0.5*(u(ij-ny)+u(ij))
  272.      &     +cnmin*u(ij+1) +cnmax*u(ij)-flxn(ij)*0.5*(u(ij+1) +u(ij))
  273.      &     +csmin*u(ij-1) +csmax*u(ij)-flxs(ij)*0.5*(u(ij-1) +u(ij))

  274.          sv(ij)= apt*vo(ij) - dpy(ij)*vol
  275.      &     +cemin*v(ij+ny)+cemax*v(ij)-flxe(ij)*0.5*(v(ij+ny)+v(ij))
  276.      &     +cwmin*v(ij-ny)+cwmax*v(ij)-flxw(ij)*0.5*(v(ij-ny)+v(ij))
  277.      &     +cnmin*v(ij+1) +cnmax*v(ij)-flxn(ij)*0.5*(v(ij+1) +v(ij))
  278.      &     +csmin*v(ij-1) +csmax*v(ij)-flxs(ij)*0.5*(v(ij-1) +v(ij))

  279.       end do
  280.       end do
  281. c
  282. c------ Buoyancy force
  283. c
  284.       if (lcalct) then

  285.       do i=2,nxm
  286.       do ij=li(i)+2,li(i)+nym
  287.         sv(ij)=sv(ij) - beta*grav*(t(ij)-tref)*vol
  288.       end do
  289.       end do

  290.       end if

  291.       call bounduv

  292. c===================================================================
  293. c ap for x-momentum
  294. c===================================================================
  295.       do i=2,nxm
  296.       do ij=li(i)+2,li(i)+nym
  297.          ap(ij)=apt-ae1(ij)-aw1(ij)-an1(ij)-as1(ij)
  298.       end do
  299.       end do
  300. C
  301. C.....PRINT INITIAL COEFFICIENT IF DESIRED
  302. C

  303. c ------ adjust coefficients of boundary nodes for x-momentum equation
  304. c        as a result of shear stress
  305.       do i=2,nxm
  306. c ------ South
  307.          ij=li(i)+2
  308.          ap(ij)=ap(ij)+2.*vdxdy
  309. c ------ North
  310.          ij=li(i)+nym
  311.          ap(ij)=ap(ij)+2.*vdxdy
  312.       end do

  313.        
  314. c
  315. c===================================================================
  316. c.....under-relaxation, solving equation system for u-velocity
  317. c ------  store apu=1/ap from u-momentum for pressure correction
  318. c===================================================================
  319. c
  320.       do i=2,nxm
  321.       do ij=li(i)+2,li(i)+nym
  322.          ap(ij)=ap(ij)/urf(1)
  323.          su(ij)=su(ij)+(1.-urf(1))*ap(ij)*u(ij)
  324.          apu(ij)=1./ap(ij)
  325.       end do
  326.       end do

  327.       call sipsolm(nx,ny,ae1,aw1,an1,as1,ap,u,su,resu(1))

  328. c===================================================================
  329. c ap for y-momentum
  330. c===================================================================
  331.       do i=2,nxm
  332.       do ij=li(i)+2,li(i)+nym
  333.         ap(ij)=apt-ae2(ij)-aw2(ij)-an2(ij)-as2(ij)
  334.       end do
  335.       end do

  336. c ------ adjust coefficients of boundary nodes for y-momentum equation
  337. c        as a result of shear stress
  338.       do j=2,nym
  339. c ------ East
  340.          ij=li(nxm)+j
  341.          ap(ij)=ap(ij)+2.*vdydx
  342. c ------ West
  343.          ij=li(2)+j
  344.          ap(ij)=ap(ij)+2.*vdydx
  345.       end do
  346. c
  347. c===================================================================
  348. c.....under-relaxation, solving equation system for v-velocity
  349. c ------  store apv=1/ap from v-momentum for pressure correction
  350. c===================================================================
  351. c
  352.       do i=2,nxm
  353.       do ij=li(i)+2,li(i)+nym
  354.          ap(ij)=ap(ij)/urf(2)
  355.          sv(ij)=sv(ij)+(1.-urf(2))*ap(ij)*v(ij)
  356.          apv(ij)=1./ap(ij)
  357.       end do
  358.       end do

  359.       call sipsolm(nx,ny,ae2,aw2,an2,as2,ap,v,sv,resu(2))

  360.       return
  361.       end

  362. C#####################################################################C
  363.       subroutine press
  364.       include 'param_piso.f'
  365. C#####################################################################C
  366. c234567890123456789012345678901234567890123456789012345678901234567890

  367.       do i=2,nxm
  368.       do ij=li(i)+2,li(i)+nym
  369.          flxe(ij)=+0.5*(u(ij)+u(ij+ny))*dy
  370.          flxw(ij)=-0.5*(u(ij)+u(ij-ny))*dy
  371.          flxn(ij)=+0.5*(v(ij)+v(ij+1) )*dx
  372.          flxs(ij)=-0.5*(v(ij)+v(ij-1) )*dx
  373.       end do
  374.       end do

  375. c===================================================================
  376. c assign fluxes adjacent to fictitious CVs.
  377. c===================================================================
  378.       do i=2,nxm
  379.         ij=li(i)+2
  380.         flxs(ij)=0.

  381.         ij=li(i)+nym
  382.         flxn(ij)=0.
  383.       end do

  384.       do j=2,nym
  385.         ij=li(2) +j
  386.         flxw(ij)=0.

  387.         ij=li(nxm)+j
  388.         flxe(ij)=0.
  389.       end do

  390.       sumo=0.
  391.       do i=2,nxm
  392.       do ij=li(i)+2,li(i)+nym
  393.         sumo=sumo+(flxe(ij)+flxw(ij)+flxn(ij)+flxs(ij))**2
  394.       end do
  395.       end do
  396.         sumo=sqrt(sumo*fnxy)

  397.       vole=vol
  398.       do i=2,nxm2
  399.       do ij=li(i)+2,li(i)+nym
  400.          apue=0.5*(apu(ij)+apu(ij+ny))
  401.          finc=dy*vole*apue
  402.      &          *((p(ij+ny)-p(ij))/dx-0.5*(dpx(ij)+dpx(ij+ny)))
  403.          flxe(ij)=flxe(ij)-finc
  404.          flxw(ij+ny)=-flxe(ij)
  405.          ae3(ij)=-dy*dy*apue
  406.          aw3(ij+ny)=ae3(ij)
  407.       end do
  408.       end do

  409.       voln=vol
  410.       do i=2,nxm
  411.       do ij=li(i)+2,li(i)+nym2
  412.          apvn=0.5*(apv(ij)+apv(ij+1))
  413.          finc=dx*voln*apvn
  414.      &            *((p(ij+1)-p(ij))/dy-0.5*(dpy(ij)+dpy(ij+1)))
  415.          flxn(ij)=flxn(ij)-finc
  416.          flxs(ij+1)=-flxn(ij)
  417.          an3(ij)=-dx*dx*apvn
  418.          as3(ij+1)=an3(ij)
  419.       end do
  420.       end do

  421. C        sum=0.
  422.       do i=2,nxm
  423.       do ij=li(i)+2,li(i)+nym
  424.          ap(ij)=-(ae3(ij)+aw3(ij)+an3(ij)+as3(ij))
  425.          su(ij)=-(flxe(ij)+flxw(ij)+flxn(ij)+flxs(ij))
  426.          pp(ij)=0.
  427. C        sum=sum+su(ij)
  428.       end do
  429.       end do
  430. C        print *,'sum=',sum
  431. C        if (iter.eq.2) then
  432. C        CALL PRINT(flxe,'  Fe  ')
  433. C        CALL PRINT(flxn,'  Fn  ')
  434. C        CALL PRINT(flxw,'  Fw  ')
  435. C        CALL PRINT(flxs,'  Fs  ')
  436. C        CALL PRINT( dpx,' DPX  ')
  437. C        CALL PRINT( dpy,' DPY  ')
  438. C        CALL PRINT( apu,' APU  ')
  439. C        CALL PRINT( apv,' APV  ')
  440. C        CALL PRINT(  su,'  SU  ')
  441. C        STOP
  442. C        endif

  443.       call sipsolm(nx,ny,ae3,aw3,an3,as3,ap,pp,su,resu(3))
  444. C
  445. c===================================================================
  446. c enforce dpp/dn=0 at boundary nodes.
  447. c no correction is performed on these points.
  448. c use pp(fictitious)=-pp(boundary) ==> linear interpolation at
  449. c boundary faces (pp_f+pp_b)/2=0 ==> no correction on u' is required.
  450. c===================================================================
  451.       do i=2,nxm
  452. c ... south
  453.          ij=li(i)+1
  454.          pp(ij)=pp(ij+1)
  455. c         pp(ij)=2.*pp(ij+1)-pp(ij+2)
  456. c ... north
  457.          ij=li(i)+ny
  458.          pp(ij)=pp(ij-1)
  459. c         pp(ij)=2.*pp(ij-1)-pp(ij-2)
  460.       end do

  461.       do j=2,nym
  462. c ... west
  463.          ij=li(1)+j
  464.          pp(ij)=pp(ij+ny)
  465. c         pp(ij)=2.*pp(ij+ny)-pp(ij+2*ny)
  466. c ... east
  467.          ij=li(nx)+j
  468.          pp(ij)=pp(ij-ny)
  469. c         pp(ij)=2.*pp(ij-ny)-pp(ij-2*ny)
  470.       end do

  471. c===================================================================

  472. c        if (iter.eq.2) then
  473. c        CALL PRINT(AE,'  AE  ')
  474. c        CALL PRINT(AW,'  AW  ')
  475. c        CALL PRINT(AN,'  AN  ')
  476. c        CALL PRINT(AS,'  AS  ')
  477. c        CALL PRINT(AP,'  AP  ')
  478. c        CALL PRINT(PP,'  PP  ')
  479. c        CALL PRINT(SU,'  SU  ')
  480. c        STOP
  481. c        endif

  482. c===================================================================
  483. c correct fluxes at interior cell face
  484. c===================================================================
  485.       do i=2,nxm2
  486.       do j=2,nym
  487.          ij=li(i)+j
  488.          flxe(ij)=flxe(ij)+ae3(ij)*(pp(ij+ny)-pp(ij))
  489.          flxw(ij+ny)=-flxe(ij)
  490.       end do
  491.       end do

  492.       do i=2,nxm
  493.       do j=2,nym2
  494.          ij=li(i)+j
  495.          flxn(ij)=flxn(ij)+an3(ij)*(pp(ij+1)-pp(ij))
  496.          flxs(ij+1)=-flxn(ij)
  497.       end do
  498.       end do

  499. c===================================================================
  500. c Check continuity
  501. c===================================================================

  502.       sumn=0.
  503.       do i=2,nxm
  504.       do ij=li(i)+2,li(i)+nym
  505.         sumn=sumn+(flxe(ij)+flxw(ij)+flxn(ij)+flxs(ij))**2
  506.       end do
  507.       end do
  508.         sumn=sqrt(sumn*fnxy)
  509.         print *,' sumn1=', sumn

  510. c===================================================================
  511. c correct pressure and velocities at cell center.
  512. c pp(ij) is at cell center, calculate pp at cell face (ppe, ppw...)
  513. c then take d(pp)/dx and d(pp)/dy to correct u, v, p at cell center.
  514. c===================================================================
  515. C
  516. C.....VALUE OF P' AT REFERENCE LOCATION TO BE SUBTRACTED FROM ALL P'
  517. C
  518.       IJPREF=LI(IPR)+JPR
  519.       PPO=PP(IJPREF)
  520. c        print *,'ipr=', ipr,'jpr=', jpr,'ppo=', ppo
  521. c
  522.       do i=2,nxm
  523.       do ij=li(i)+2,li(i)+nym

  524.          ppe=0.5*(pp(ij+ny)+pp(ij))
  525.          ppw=0.5*(pp(ij-ny)+pp(ij))
  526.          ppn=0.5*(pp(ij+1) +pp(ij))
  527.          pps=0.5*(pp(ij-1) +pp(ij))
  528.          
  529.          uprime(ij)=-dy*(ppe-ppw)*apu(ij)
  530.          vprime(ij)=-dx*(ppn-pps)*apv(ij)
  531.          u(ij)=u(ij)+uprime(ij)
  532.          v(ij)=v(ij)+vprime(ij)
  533.          p(ij)=p(ij)+urf(3)*(pp(ij)-ppo)

  534.       end do
  535.       end do

  536. c===================================================================
  537. c assign pressure at fictitious cell.
  538. c===================================================================
  539.       do i=2,nxm
  540. c ... south
  541.          ij=li(i)+1
  542.          p(ij)=p(ij+1)
  543. c         p(ij)=2.*p(ij+1)-p(ij+2)
  544. c ... north
  545.          ij=li(i)+ny
  546.          p(ij)=p(ij-1)
  547. c         p(ij)=2.*p(ij-1)-p(ij-2)
  548.       end do

  549.       do j=2,nym
  550. c ... west
  551.          ij=li(1)+j
  552.          p(ij)=p(ij+ny)
  553. c         p(ij)=2.*p(ij+ny)-p(ij+2*ny)
  554. c ... east
  555.          ij=li(nx)+j
  556.          p(ij)=p(ij-ny)
  557. c         p(ij)=2.*p(ij-ny)-p(ij-2*ny)
  558.       end do

  559.       return
  560.       end
  561. C#####################################################################C
  562.       subroutine press2
  563.       include 'param_piso.f'
  564. C#####################################################################C
  565. c234567890123456789012345678901234567890123456789012345678901234567890

  566.       do i=2,nxm
  567.       do ij=li(i)+2,li(i)+nym
  568.       utilde(ij)=-apu(ij)*(ae1(ij)*uprime(ij+nj)+aw1(ij)*uprime(ij-nj)
  569.      +                    +an1(ij)*uprime(ij+ 1)+as1(ij)*uprime(ij- 1))
  570.       vtilde(ij)=-apv(ij)*(ae2(ij)*vprime(ij+nj)+aw2(ij)*vprime(ij-nj)
  571.      +                    +an2(ij)*vprime(ij+ 1)+as2(ij)*vprime(ij- 1))
  572.       end do
  573.       end do

  574.       do i=2,nxm
  575.       do ij=li(i)+2,li(i)+nym
  576.          flxe2(ij)=+0.5*(utilde(ij)+utilde(ij+ny))*dy
  577.          flxw2(ij)=-0.5*(utilde(ij)+utilde(ij-ny))*dy
  578.          flxn2(ij)=+0.5*(vtilde(ij)+vtilde(ij+1) )*dx
  579.          flxs2(ij)=-0.5*(vtilde(ij)+vtilde(ij-1) )*dx
  580.       end do
  581.       end do

  582. c===================================================================
  583. c assign fluxes adjacent to fictitious CVs.
  584. c===================================================================
  585.       do i=2,nxm
  586.         ij=li(i)+2
  587.         flxs2(ij)=0.

  588.         ij=li(i)+nym
  589.         flxn2(ij)=0.
  590.       end do

  591.       do j=2,nym
  592.         ij=li(2) +j
  593.         flxw2(ij)=0.

  594.         ij=li(nxm)+j
  595.         flxe2(ij)=0.
  596.       end do

  597. C        sum=0.
  598.       do i=2,nxm
  599.       do ij=li(i)+2,li(i)+nym
  600.          ap(ij)=-(ae3(ij)+aw3(ij)+an3(ij)+as3(ij))
  601.          su(ij)=-(flxe2(ij)+flxw2(ij)+flxn2(ij)+flxs2(ij))
  602.          pp(ij)=0.
  603. C        sum=sum+su(ij)
  604.       end do
  605.       end do
  606. C        print *,'sum=',sum
  607. C        if (iter.eq.2) then
  608. C        CALL PRINT(flxe,'  Fe  ')
  609. C        CALL PRINT(flxn,'  Fn  ')
  610. C        CALL PRINT(flxw,'  Fw  ')
  611. C        CALL PRINT(flxs,'  Fs  ')
  612. C        CALL PRINT( dpx,' DPX  ')
  613. C        CALL PRINT( dpy,' DPY  ')
  614. C        CALL PRINT( apu,' APU  ')
  615. C        CALL PRINT( apv,' APV  ')
  616. C        CALL PRINT(  su,'  SU  ')
  617. C        STOP
  618. C        endif

  619.       call sipsolm(nx,ny,ae3,aw3,an3,as3,ap,pp,su,resu(3))
  620. C
  621. c===================================================================
  622. c enforce dpp/dn=0 at boundary nodes.
  623. c no correction is performed on these points.
  624. c use pp(fictitious)=-pp(boundary) ==> linear interpolation at
  625. c boundary faces (pp_f+pp_b)/2=0 ==> no correction on u' is required.
  626. c===================================================================
  627.       do i=2,nxm
  628. c ... south
  629.          ij=li(i)+1
  630.          pp(ij)=pp(ij+1)
  631. c         pp(ij)=2.*pp(ij+1)-pp(ij+2)
  632. c ... north
  633.          ij=li(i)+ny
  634.          pp(ij)=pp(ij-1)
  635. c         pp(ij)=2.*pp(ij-1)-pp(ij-2)
  636.       end do

  637.       do j=2,nym
  638. c ... west
  639.          ij=li(1)+j
  640.          pp(ij)=pp(ij+ny)
  641. c         pp(ij)=2.*pp(ij+ny)-pp(ij+2*ny)
  642. c ... east
  643.          ij=li(nx)+j
  644.          pp(ij)=pp(ij-ny)
  645. c         pp(ij)=2.*pp(ij-ny)-pp(ij-2*ny)
  646.       end do

  647. c===================================================================

  648. c        if (iter.eq.2) then
  649. c        CALL PRINT(AE,'  AE  ')
  650. c        CALL PRINT(AW,'  AW  ')
  651. c        CALL PRINT(AN,'  AN  ')
  652. c        CALL PRINT(AS,'  AS  ')
  653. c        CALL PRINT(AP,'  AP  ')
  654. c        CALL PRINT(PP,'  PP  ')
  655. c        CALL PRINT(SU,'  SU  ')
  656. c        STOP
  657. c        endif

  658. c===================================================================
  659. c correct fluxes at interior cell face
  660. c===================================================================
  661.       do i=2,nxm2
  662.       do j=2,nym
  663.          ij=li(i)+j
  664.          flxe(ij)=flxe(ij)+flxe2(ij)+ae3(ij)*(pp(ij+ny)-pp(ij))
  665.          flxw(ij+ny)=-flxe(ij)
  666.       end do
  667.       end do

  668.       do i=2,nxm
  669.       do j=2,nym2
  670.          ij=li(i)+j
  671.          flxn(ij)=flxn(ij)+flxn2(ij)+an3(ij)*(pp(ij+1)-pp(ij))
  672.          flxs(ij+1)=-flxn(ij)
  673.       end do
  674.       end do

  675. c===================================================================
  676. c Check continuity
  677. c===================================================================

  678.       sumn=0.
  679.       do i=2,nxm
  680.       do ij=li(i)+2,li(i)+nym
  681.         sumn=sumn+(flxe(ij)+flxw(ij)+flxn(ij)+flxs(ij))**2
  682.       end do
  683.       end do
  684.         sumn=sqrt(sumn*fnxy)
  685.         print *,' sumn2=', sumn

  686. c===================================================================
  687. c correct pressure and velocities at cell center.
  688. c pp(ij) is at cell center, calculate pp at cell face (ppe, ppw...)
  689. c then take d(pp)/dx and d(pp)/dy to correct u, v, p at cell center.
  690. c===================================================================
  691. C
  692. C.....VALUE OF P' AT REFERENCE LOCATION TO BE SUBTRACTED FROM ALL P'
  693. C
  694.       IJPREF=LI(IPR)+JPR
  695.       PPO=PP(IJPREF)
  696. c        print *,'ipr=', ipr,'jpr=', jpr,'ppo=', ppo
  697. c
  698.       do i=2,nxm
  699.       do ij=li(i)+2,li(i)+nym

  700.          ppe=0.5*(pp(ij+ny)+pp(ij))
  701.          ppw=0.5*(pp(ij-ny)+pp(ij))
  702.          ppn=0.5*(pp(ij+1) +pp(ij))
  703.          pps=0.5*(pp(ij-1) +pp(ij))

  704.          u(ij)=u(ij)+utilde(ij)-dy*(ppe-ppw)*apu(ij)
  705.          v(ij)=v(ij)+vtilde(ij)-dx*(ppn-pps)*apv(ij)
  706.          p(ij)=p(ij)+urf(3)*(pp(ij)-ppo)

  707.       end do
  708.       end do

  709. c===================================================================
  710. c assign pressure at fictitious cell.
  711. c===================================================================
  712.       do i=2,nxm
  713. c ... south
  714.          ij=li(i)+1
  715.          p(ij)=p(ij+1)
  716. c         p(ij)=2.*p(ij+1)-p(ij+2)
  717. c ... north
  718.          ij=li(i)+ny
  719.          p(ij)=p(ij-1)
  720. c         p(ij)=2.*p(ij-1)-p(ij-2)
  721.       end do

  722.       do j=2,nym
  723. c ... west
  724.          ij=li(1)+j
  725.          p(ij)=p(ij+ny)
  726. c         p(ij)=2.*p(ij+ny)-p(ij+2*ny)
  727. c ... east
  728.          ij=li(nx)+j
  729.          p(ij)=p(ij-ny)
  730. c         p(ij)=2.*p(ij-ny)-p(ij-2*ny)
  731.       end do

  732.       return
  733.       end

  734. C#####################################################################C
  735.       subroutine temps
  736.       include 'param_piso.f'
  737. C#####################################################################C
  738. c234567890123456789012345678901234567890123456789012345678901234567890
  739. c
  740.       do i=2,nxm
  741.       do ij=li(i)+2,li(i)+nym

  742.          cemin=min(flxe(ij),0)
  743.          cwmin=min(flxw(ij),0)
  744.          cnmin=min(flxn(ij),0)
  745.          csmin=min(flxs(ij),0)
  746.          cemax=max(flxe(ij),0)
  747.          cwmax=max(flxw(ij),0)
  748.          cnmax=max(flxn(ij),0)
  749.          csmax=max(flxs(ij),0)

  750.          ae1(ij)=cemin-adydx
  751.          aw1(ij)=cwmin-adydx
  752.          an1(ij)=cnmin-adxdy
  753.          as1(ij)=csmin-adxdy
  754.          ap(ij)=apt-ae1(ij)-aw1(ij)-an1(ij)-as1(ij)

  755. c234567890123456789012345678901234567890123456789012345678901234567890
  756.          su(ij)= apt*to(ij)
  757.      &     +cemin*t(ij+ny)+cemax*t(ij)-flxe(ij)*0.5*(t(ij+ny)+t(ij))
  758.      &     +cwmin*t(ij-ny)+cwmax*t(ij)-flxw(ij)*0.5*(t(ij-ny)+t(ij))
  759.      &     +cnmin*t(ij+1) +cnmax*t(ij)-flxn(ij)*0.5*(t(ij+1) +t(ij))
  760.      &     +csmin*t(ij-1) +csmax*t(ij)-flxs(ij)*0.5*(t(ij-1) +t(ij))

  761.       end do
  762.       end do

  763.       call boundt
  764. c
  765. c===================================================================
  766. c.....under-relaxation, solving equation system for temperature
  767. c===================================================================
  768. c
  769.       do i=2,nxm
  770.       do ij=li(i)+2,li(i)+nym
  771.          ap(ij)=ap(ij)/urf(4)
  772.          su(ij)=su(ij)+(1.-urf(4))*ap(ij)*t(ij)
  773.       end do
  774.       end do

  775.       call sipsolm(nx,ny,ae1,aw1,an1,as1,ap,t,su,resu(4))

  776. c===================================================================
  777. c assign values at fictitious nodes to satisfy boundary conditions.
  778. c===================================================================
  779.       do i=2,nxm
  780. c south: adiabatic wall
  781.         ij=li(i)+1
  782.         t(ij)=t(ij+1)
  783. c north: adiabatic wall
  784.         ij=li(i)+ny
  785.         t(ij)=t(ij-1)
  786.       end do

  787.       do j=2,nym
  788. c west: T_c isothermal wall
  789.         ij=li(1) +j
  790.         t(ij)=2*tc-t(ij+ny)
  791. c east: T_h isothermal wall
  792.         ij=li(nx)+j
  793.         t(ij)=2*th-t(ij-ny)
  794.       end do

  795.       return
  796.       end

  797. C#####################################################################C
  798.       subroutine bounduv
  799.       include 'param_piso.f'
  800. C#####################################################################C
  801. c234567890123456789012345678901234567890123456789012345678901234567890

  802. c normal stress du/dx=0, dv/dy and shear stress du/dy, dv/dx
  803. c East: (du/dx)_e=0
  804.       do j=2,nym
  805.          ij=li(nxm)+j
  806.          ae1(ij)=0.
  807.          ae2(ij)=0.
  808.       end do

  809. c West: (du/dx)_w=0
  810.       do j=2,nym
  811.          ij=li(2)+j
  812.          aw1(ij)=0.
  813.          aw2(ij)=0.
  814.       end do

  815. c South: absorb as into ap, u_s=2*ubottom-u_p, ubottom=0.
  816.       do i=2,nxm
  817.          ij=li(i)+2
  818.          as1(ij)=0.
  819.          as2(ij)=0.
  820.       end do

  821. c North: absorb an into ap, u_n=2*ulid-u_p
  822.       do i=2,nxm
  823.          ij=li(i)+nym
  824.          an1(ij)=0.
  825.          an2(ij)=0.
  826.          su(ij)=su(ij)+2*vdxdy*ulid
  827.       end do

  828.       return
  829.       end

  830. C#####################################################################C
  831.       subroutine boundt
  832.       include 'param_piso.f'
  833. C#####################################################################C
  834. c234567890123456789012345678901234567890123456789012345678901234567890

  835. c East: isothermal wall; absorb ae into ap, t_e=2*th-t_p
  836.       do j=2,nym
  837.          ij=li(nxm)+j
  838.          ae1(ij)=0.
  839.          ap(ij)=ap(ij)+adydx
  840.          su(ij)=su(ij)+2*adydx*th
  841.       end do

  842. c West: isothermal wall; absorb aw into ap, t_w=2*tc-t_p
  843.       do j=2,nym
  844.          ij=li(2)+j
  845.          aw1(ij)=0.
  846.          ap(ij)=ap(ij)+adydx
  847.          su(ij)=su(ij)+2*adydx*tc
  848.       end do

  849. c South: adiabatic wall
  850.       do i=2,nxm
  851.          ij=li(i)+2
  852.          as1(ij)=0.
  853.          ap(ij)=ap(ij)-adxdy
  854.       end do

  855. c North: adiabatic wall
  856.       do i=2,nxm
  857.          ij=li(i)+nym
  858.          an1(ij)=0.
  859.          ap(ij)=ap(ij)-adxdy
  860.       end do

  861.       return
  862.       end

  863. C#####################################################################C
  864.       SUBROUTINE SIPSOLM(MI,MJ,GE,GW,GN,GS,GP,FI,Q,RES0)
  865. C#####################################################################C
  866. C  REVISED FOR ME58:269 FINAL PROJECT
  867. C
  868. C  MI: # of actual + fictitious CVs in the x-dir.
  869. C  MJ: # of actual + fictitious CVs in the y-dir.
  870. C
  871. C  GW*FI(K-MJ)+GS*FI(K-1)+GP*FI(K)+GN*FI(K+1)+GE*FI(K+MJ)=Q(K)
  872. C
  873. C  FI=INITIAL GUESS. FOR EXAMPLE,
  874. c  USE OLD U FOR U-COMPONENT VELOCITY.
  875. C
  876. C-------------------------------------------------------------
  877. C     This is the ILU solver after Stone; see Sect. 5.3.4 for
  878. C     a description of the algorithm.
  879. C
  880. C     M. Peric, Institut fuer Schiffbau, Hamburg, 1995
  881. C=============================================================
  882.       PARAMETER (MAXITSIP=20, MX=102, MY=102, MXY=MX*MY)
  883.       REAL LW,LS,LPR,RES0
  884.       DIMENSION GE(1),GW(1),GN(1),GS(1),GP(1),Q(1)
  885.       DIMENSION FI(MXY),UN(MXY),UE(MXY),RES(MXY)
  886.       DIMENSION LW(MXY),LS(MXY),LPR(MXY)
  887.       DIMENSION LI(MX)

  888.       IF (MI.GT.MX) THEN
  889.          PRINT *,'MI IS GREATER THAN MX IN SR. SIPSOLM'
  890.          STOP
  891.       ENDIF

  892.       ALFA=0.92
  893.       RESMAX=0.2
  894.       MIM=MI-1
  895.       MJM=MJ-1
  896.       MIJ=MI*MJ
  897.       DO I=1,MI
  898.         LI(I)=(I-1)*MJ
  899.       END DO

  900. C
  901. C.....CALCULATE ELEMENTS OF [L] AND [U] MATRICES
  902. C
  903.       DO I=2,MIM
  904.       DO IJ=LI(I)+2,LI(I)+MJM
  905.         LW(IJ)=GW(IJ)/(1.+ALFA*UN(IJ-MJ))
  906.         LS(IJ)=GS(IJ)/(1.+ALFA*UE(IJ-1))
  907.         P1=ALFA*LW(IJ)*UN(IJ-MJ)
  908.         P2=ALFA*LS(IJ)*UE(IJ-1)
  909.         LPR(IJ)=1./(GP(IJ)+P1+P2-LW(IJ)*UE(IJ-MJ)-LS(IJ)*UN(IJ-1))
  910.         UN(IJ)=(GN(IJ)-P1)*LPR(IJ)
  911.         UE(IJ)=(GE(IJ)-P2)*LPR(IJ)
  912.       END DO
  913.       END DO
  914. C      
  915. C.....CALCULATE RESIDUAL AND AUXILLIARY VECTORS; INNER ITERATION LOOP
  916. C
  917.       DO N=1,MAXITSIP
  918. C
  919.         RESN=0.
  920.         DO I=2,MIM
  921.         DO IJ=LI(I)+2,LI(I)+MJM
  922.           RES(IJ)=Q(IJ)-GP(IJ)*FI(IJ)-GN(IJ)*FI(IJ+1)-
  923.      *            GS(IJ)*FI(IJ-1)-GE(IJ)*FI(IJ+MJ)-GW(IJ)*FI(IJ-MJ)
  924.           RESN=RESN+ABS(RES(IJ))
  925.           RES(IJ)=(RES(IJ)-LS(IJ)*RES(IJ-1)-LW(IJ)*RES(IJ-MJ))*LPR(IJ)
  926.         END DO
  927.         END DO
  928.         IF(N.EQ.1) RES0=RESN
  929. C
  930. C.....CALCULATE INCREMENT AND CORRECT VARIABLE
  931. C
  932.         DO I=MIM,2,-1
  933.         DO IJ=LI(I)+MJM,LI(I)+2,-1
  934.           RES(IJ)=RES(IJ)-UN(IJ)*RES(IJ+1)-UE(IJ)*RES(IJ+MJ)
  935.           FI(IJ)=FI(IJ)+RES(IJ)
  936.         END DO
  937.         END DO
  938. C
  939. C.....CONVERGENCE CHECK
  940. C
  941.         RSM=RESN/(RES0+1.E-20)
  942.         IF(RSM.LT.RESMAX) RETURN

  943.       END DO
  944. C
  945.       PRINT *,'EXCEEDS MAXITSIP IN SR. SIPSOL, RSM = ',RSM
  946.       PRINT *,'RESMAX=', RESMAX, 'MAXITSIP=', MAXITSIP
  947. C
  948.       RETURN
  949.       END
  950. C
  951. C#####################################################################C
  952. C#############################################################
  953.       SUBROUTINE PRINT(PHI,HEDPHI)
  954. C#############################################################
  955. C    This routine prints 2D array in an easy to read format.
  956. C--------------------------------------------------------------        
  957.         include 'param_piso.f'

  958.       PARAMETER (NPHI=4)
  959.       DIMENSION PHI(NXY)
  960.       CHARACTER*6 HEDPHI
  961. C--------------------------------------------------------
  962. C
  963.       WRITE(3,20) HEDPHI
  964.       NL=(NX-1)/12+1
  965. C
  966.       DO L=1,NL
  967.         IS=(L-1)*12+1
  968.         IE=MIN(NX,L*12)
  969.         WRITE(3,21) (I,I=IS,IE)
  970.         WRITE(3,22)
  971. C
  972.         DO J=NY,1,-1
  973.           WRITE(3,23) J,(PHI(LI(I)+J),I=IS,IE)
  974.         END DO
  975.       END DO
  976. C
  977.    20 FORMAT(2X,26('*-'),5X,A6,5X,26('-*'))
  978.    21 FORMAT(3X,'I = ',I3,11I10)
  979.    22 FORMAT(2X,'J')
  980.    23 FORMAT(1X,I3,1P12E10.2)
  981. C
  982.       RETURN
  983.       END
复制代码

[ 本帖最后由 yejet 于 2006-11-19 19:39 编辑 ]
回复
分享到:

使用道具 举报

发表于 2009-1-2 16:07 | 显示全部楼层
太伟大了,楼主  我也是学传热的,有机会交流一下,173251077
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 20:19 , Processed in 0.055964 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表