⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvm_circle.f90

📁 圆柱绕流问题的涡方法数值模拟(fortran源码)
💻 F90
字号:
subroutine circle()
use varible
logical:: state
real   :: xl2,yl2,tkk,skk,ubb,tempv,dis
real   :: bv0(nmax,2),bc0(nall,2),spv(knp,2)
integer:: i,k,j,L,M,k1,k2,L1,self,i2
!---------dx,dy为GX,GY数据存贮,FA为边界涡的数据存贮----
real   :: dx(nlimit,knp),dy(nlimit,knp),VAx(nlimit,knp),VAy(nlimit,knp),FA(nall)
real   :: bphy(nmax),kk1(6),kk2(6),kk3(6),kk4(6),fvx1(pnum),fvx2(pnum),fvy1(pnum),fvy2(pnum)
real   ::px0(nlimit,pnum),py0(nlimit,pnum),pz0(nlimit,pnum),pvx0(nlimit,pnum),pvy0(nlimit,pnum),pvz0(nlimit,pnum)
!---------------------颗粒变量声明-----------------------
real   ::bsigma,tvx,tvy,cosa,sina
!-----------参量赋值---------
open(unit=110,file="kk.txt")
 xl2=xl/2
 yl2=yl/2
 ubb=0.5*U*U*yl
 ddx=0.01
 ddy=0.01
 dnt=dt*U/xl
 do k=kk+1,ns
    fx(k)=0.0
	fy(k)=0.0
 end do
 nstep=1
 do i=1,nall
  	do j=1,2
	bv0(i,j)=bv(i,j)
	bc0(i,j)=bc(i,j)
	end do
 end do
!--------------------------------
 state=.false.
!---------循环主体-------------
do while(kk<ns)
   kk=kk+1
   tkk=float(kk)*dt
   if (state==.true.)then
    skk=5.e-3*cos(2.0*pi*14.8*tkk)
    do i=1,nall
    bv(i,2)=bv0(i,2)+5.e-3*cos(2.0*pi*14.8*tkk)
    bc(i,2)=bc0(i,2)+5.e-3*cos(2.0*pi*14.8*tkk)
    end do 
   else
    continue
   end if

!--------------------------write-------------------------

!-------------KK步以前的涡的合并与坐标更新---------------
   call combination(kk,Gx,Gy)
!-------------------已有数据存贮-------------------------
   do k=1,kk
      do L=1,knp
      dx(k,L)=Gx(k,L)
      dy(k,L)=Gy(k,L)
      end do
   end do
   do i=1,nall
   fa(i)=btao(i)
   end do
   
!--------------------壁面镜相-------------------

!-------------------新生边界涡强度计算-------------------
   do i=1,nall
   tempv=0
      do L=1,knp
	     do k=1,kk
		 if (ndp(k,L)==0)then
		  continue 
		 else
		  dis=sqrt((bc(i,1)-dx(k,L))**2+(bc(i,2)-dy(k,L))**2)
		  if(dis<sigma(k))then 
		   dis=sigma(k)
		  else
		   continue
		  end if
		  tempv=tempv+tao(k,L)*(-sin(thta(i))*(bc(i,1)-dx(k,L))+cos(thta(i))*(bc(i,2)-dy(k,L)))/2.0/pi/dis/dis
		 end if
		 end do
      end do
   bphy(i)=-cos(thta(i))*U*cos(alpha)-sin(thta(i))*U*sin(alpha)-tempv
   end do
   bphy(nmax)=0.0
   do L=1,knp
      do k=1,kk
	  bphy(nmax)=bphy(nmax)+tao(k,L)
	  end do
   end do
   bphy(nmax)=-bphy(nmax)
!--------------去掉一个多余条件---------------
   do i=1,nall
      do j=1,nall 
      bmatrx(i,j)=0
	     do k=1,nmax
		 bmatrx(i,j)=bmatrx(i,j)+matrx1(k,i)*matrx1(k,j)
		 end do
	  end do
   end do
   do i=1,nall
   btao(i)=0
      do k=1,nmax
      btao(i)=btao(i)+matrx1(k,i)*bphy(k)
	  end do
   end do
!------------计算新一轮壁面的壁面涡强度----------------------
   call gs(bmatrx,btao,nall)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!------------计算KK时刻所有涡之间的诱导速度及点涡新坐标------------------
   do m=1,mpv
      do L=1,knp
	     do k=1,kk
		    VAx(k,L)=0.0
		    VAy(k,L)=0.0
            if (ndp(k,L)==0)then
			  continue
			else
     	      do i=1,nall
		      dis=sqrt((dx(k,L)-bv(i,1))**2+(dy(k,L)-bv(i,2))**2)
		      if (dis<sigma0(k,M))then
		        dis=sigma0(k,M)
	   	      else 
		        continue
		      end if
		      VAx(k,L)=VAx(k,L)+btao(i)*(-(dy(k,L)-bv(i,2)))/2/pi/dis/dis
		      VAy(k,L)=VAy(k,L)+btao(i)*(dx(k,L)-bv(i,1))/2/pi/dis/dis
		      end do
		      do k1=1,kk
		      if (k1==k)then
	            continue
			  else 
			    if (ndp(k1,L)==0)then
			      continue
			    else
			      dis=sqrt((dx(k,L)-dx(k1,L))**2+(dy(k,L)-dy(k1,L))**2)
			      if (dis<sigma0(k1,M))then
			        dis=sigma0(k1,M)
			      else
			        continue 
			      end if
			      VAx(k,L)=VAx(k,L)+tao(k1,L)*(-(dy(k,L)-dy(k1,L)))/2/pi/dis/dis
				  VAy(k,L)=VAy(k,L)+tao(k1,L)*(dx(k,L)-dx(k1,L))/2/pi/dis/dis
			    end if
			  end if
			  end do

			  do L1=1,Knp
			  if (L1==L)then
			    continue
			  else
			    do k2=1,kk
			    if (ndp(k2,L1)==0)then
			      continue
			    else
			      dis=sqrt((dx(k,L)-dx(k2,L1))**2+(dy(k,L)-dy(k2,L1))**2)
			      if (dis<sigma0(k2,M))then
			    	  dis=sigma0(k2,M)
			    	else 
				    continue
				  end if
				  VAx(k,L)=VAx(k,L)+tao(k2,L1)*(-(dy(k,L)-dy(k2,L1)))/2/pi/dis/dis
				  VAy(k,L)=VAy(k,L)+tao(k2,L1)*(dx(k,L)-dx(k2,L1))/2/pi/dis/dis
		        end if
			    end do
			  end if
		      end do
		      VAx(k,L)=U*cos(alpha)-VAx(k,L)
		      VAy(k,L)=U*sin(alpha)-VAy(k,L)
		    end if
		 end do
	  end do
	  do L=1,knp
	     do k=1,kk
		 if (ndp(k,L)==0)then 
	       continue
		 else
		   dx(k,L)=dx(k,L)+VAx(k,L)*ddt
		   dy(k,L)=dy(k,L)+VAy(k,L)*ddt
		 end if 
		 end do
	  end do
	  call combination(kk,dx,dy)
   end do
!**********************************************************************
!**********************************************************************
!**********************************************************************
!与壁面接触时
do k=1,kk
   do L=1,knp
      dis=sqrt(dx(k,L)**2+dy(k,L)**2)
	  if(dis<xl2)then
	    tao(k,L)=0.0
		dx(k,L)=0.0
		dy(k,L)=0.0
		ndp(k,L)=0.0
	  else 
	    continue
	  end if
   end do
end do

!----------------受力分析--------------
   if (kk>=2)then
     do i=1,nall
        Fx(kk-1)=Fx(kk-1)+bv(i,2)*(btao(i)-Fa(i))/dt/ubb
        Fy(kk-1)=Fy(kk-1)+bv(i,1)*(btao(i)-Fa(i))/dt/ubb
     end do
   else
     continue
   end if 
!****************************************************************************
!****************************************************************************
!****************************************************************************
!****************************************************************************
   if (kk==ns)then
     continue
   else
     do k=1,kk
        do L=1,knp
    	   if (ndp(k,L)==0)then
 		     continue
 		   else
 		     Fx(kk)=Fx(kk)+tao(k,L)*(dy(k,L)-Gy(k,L))/dt/Ubb
 		     Fy(kk)=Fy(kk)+tao(k,L)*(dx(k,L)-Gx(k,L))/dt/ubb
 		   end if
        end do
     end do
!----------原点涡坐标代换及生成新点涡的初始坐标---------
     do L=1,knp
        do k=1,kk
	       Gx(k+1,L)=dx(k,L)
		   Gy(k+1,L)=dy(k,L)
	    end do 
     end do
     do i=1,knp
        k=nt(i)
	    Gx(1,i)=bv(k,1)*(1+pi/nall)
	    Gy(1,i)=bv(k,2)*(1+pi/nall)
     end do

    !do m=1,mpv
     do i=1,knp
        self=nt(i)
	    spv(i,1)=0
	    spv(i,2)=0
	    do i2=1,nall
	       if(self==i2)then
		     continue
		   else
		     dis=(Gx(1,i)-bv(i2,1))**2+(Gy(1,i)-bv(i2,2))**2
		     spv(i,1)=spv(i,1)+btao(i2)*(-(Gy(1,i)-bv(i2,2)))/2/pi/dis
		     spv(i,2)=spv(i,2)+btao(i2)*(Gx(1,i)-bv(i2,1))/2/pi/dis
		   end if
	    end do
	    do L=1,knp
	       do k=1,kk
		      if(ndp(k,L)==0)then 
			    continue
		      else
			    dis=sqrt((Gx(1,i)-dx(k,L))**2+(Gy(1,i)-dy(k,L))**2)
			    if(dis<sigma(k))then
			      dis=sigma(k)
			    else
			      continue
			    end if
			  spv(i,1)=spv(i,1)+tao(k,L)*(-(Gy(1,i)-dy(k,L)))/2/pi/dis/dis
			  spv(i,2)=spv(i,2)+tao(k,L)*(Gx(1,i)-dx(k,L))/2/pi/dis/dis
			  end if
		   end do
	    end do
	    spv(i,1)=U*cos(alpha)-spv(i,1)
	    spv(i,2)=U*sin(alpha)-spv(i,2)
     end do
     do i=1,knp
        Gx(1,i)=Gx(1,i)+spv(i,1)*dt
	    Gy(1,i)=Gy(1,i)+spv(i,2)*dt
     end do
    !end do
     do L=1,knp
        do k=1,kk
	       k1=kk+1-k
	       tao(k1+1,L)=tao(k1,L)
	       ndp(k1+1,L)=ndp(k1,L)
	    end do
     end do
     do i=1,knp
        k=nt(i)
	    ndp(1,i)=1
	    tao(1,i)=btao(k)
     end do
     do L=1,knp
        Fx(kk)=Fx(kk)+Gy(1,L)*tao(1,L)/dt/ubb
	    Fy(kk)=Fy(kk)+Gx(1,L)*tao(1,L)/dt/ubb
     end do
     Fy(kk)=Fy(kk)+0.01*5.e-3*(2*pi*14.8)**2*cos(2*pi*14.8*tkk)/ubb
   end if
!*************************************************************************************
!*************************************************************************************
!-----------------颗粒相的计算------------------------
write(110,*)kk
   if(kk<=pt)then
     continue
   else 
     do i=1,pnum
        fvx(2,i)=0.0
        fvy(2,i)=0.0
        do k=1,kk+1
           do L=1,knp
	          if(ndp(k,L)==0)then 
		        continue
		      else
                dis=sqrt((xL*px(kk-1,i)-Gx(k,L))**2+(xL*py(kk-1,i)-Gy(k,L))**2)
	            if(dis<sigma(k))then
		          dis=sigma(k)
		        else 
		          continue
		        end if
		        fvx(2,i)=fvx(2,i)+tao(k,L)*(-(xL*py(kk-1,i)-Gy(k,L)))/2/pi/dis/dis
		        fvy(2,i)=fvy(2,i)+tao(k,L)*(xL*px(kk-1,i)-Gx(k,L))/2/pi/dis/dis
		      end if
	       end do
        end do
        do j=1,nall
		   if(bnp(j)==1)then 
		      continue
		   else
             dis=sqrt((xL*px(kk-1,i)-bv(j,1))**2+(xL*py(kk-1,i)-bv(j,2))**2)
	         bsigma=max(abs(0.5*(bv(j+1,1)-bv(j,1))),abs(0.5*(bv(j+1,2)-bv(j,2))))
	         if(dis<bsigma)then
	           dis=bsigma
	         else
	           continue
	         end if
	         fvx(2,i)=fvx(2,i)+btao(j)*(-(xL*py(kk-1,i)-bv(j,2)))/2/pi/dis/dis
	         fvy(2,i)=fvy(2,i)+btao(j)*(xL*px(kk-1,i)-bv(j,1))/2/pi/dis/dis
		   end if 
        end do
        fvx(2,i)=U*cos(alpha)-fvx(2,i)
        fvy(2,i)=U*sin(alpha)-fvy(2,i)
!------------------------------------------------------------------------------------
		dudx(i)=0.0
		dudy(i)=0.0
		dvdx(i)=0.0
		dvdy(i)=0.0
		do k=1,kk+1
		   do L=1,knp
		      if(ndp(k,L)==0)then
				continue 
			  else
				dis=sqrt((xL*px(kk-1,i)-Gx(k,L))**2+(xL*py(kk-1,i)-Gy(k,L))**2)
				if(dis<sigma(k))then
				  dis=sigma(k)
				else
				  continue
				end if
				dudx(i)=dudx(i)-tao(k,L)*(xL*px(kk-1,i)-Gx(k,L))*(xL*py(kk-1,i)-Gy(k,L))/(dis**4)/pi
				dudy(i)=dudy(i)+tao(k,L)*(dis**2-2*(xL*py(kk-1,i)-Gy(k,L))**2)/(dis**4)/pi/2.0
				dvdx(i)=dvdx(i)-tao(k,L)*(dis**2-2*(xL*px(kk-1,i)-Gx(k,L))**2)/(dis**4)/pi/2.0
				dvdy(i)=-dudx(i)				   	   		   
			  end if
		   end do
		end do
		fvx(2,i)=fvx(2,i)/U
		fvy(2,i)=fvy(2,i)/U
        dudx(i)=dudx(i)*Xl/U
		dudy(i)=dudy(i)*XL/U
        dvdx(i)=dvdx(i)*XL/U
        dvdy(i)=dvdy(i)*XL/U
!-----------------------颗粒运动计算--------------------------
        do j=1,6
           kk1(j)=dfunc(ti,pvx(kk-1,i),pvy(kk-1,i),pvz(kk-1,i),px(kk-1,i),py(kk-1,i),pz(kk-1,i),j,i)
        end do
        do j=1,6
           kk2(j)=dfunc(ti+dnt/2,pvx(kk-1,i)+kk1(1)*dnt/2,pvy(kk-1,i)+kk1(2)*dnt/2,pvz(kk-1,i)+kk1(3)*dnt/2,px(kk-1,i)+kk1(4)*dnt/2,py(kk-1,i)+kk1(5)*dnt/2,pz(kk-1,i)+kk1(6)*dnt/2,j,i)
        end do
        do j=1,6
           kk3(j)=dfunc(ti+dnt/2,pvx(kk-1,i)+kk2(1)*dnt/2,pvy(kk-1,i)+kk2(2)*dnt/2,pvz(kk-1,i)+kk2(3)*dnt/2,px(kk-1,i)+kk2(4)*dnt/2,py(kk-1,i)+kk2(5)*dnt/2,pz(kk-1,i)+kk2(6)*dnt/2,j,i)
        end do
        do j=1,6
           kk4(j)=dfunc(ti+dnt/2,pvx(kk-1,i)+kk3(1)*dnt/2,pvy(kk-1,i)+kk3(2)*dnt/2,pvz(kk-1,i)+kk3(3)*dnt/2,px(kk-1,i)+kk3(4)*dnt/2,py(kk-1,i)+kk3(5)*dnt/2,pz(kk-1,i)+kk3(6)*dnt/2,j,i)
        end do
        pvx0(kk,i)=pvx(kk-1,i)
        pvy0(kk,i)=pvy(kk-1,i)
        pvz0(kk,i)=pvz(kk-1,i)
        px0(kk,i)=px(kk-1,i)
        py0(kk,i)=py(kk-1,i)
        pz0(kk,i)=pz(kk-1,i)
        pvx(kk,i)=pvx(kk-1,i)+dnt*(kk1(1)+2*kk2(1)+2*kk3(1)+kk4(1))/6
        pvy(kk,i)=pvy(kk-1,i)+dnt*(kk1(2)+2*kk2(2)+2*kk3(2)+kk4(2))/6
        pvz(kk,i)=pvz(kk-1,i)+dnt*(kk1(3)+2*kk2(3)+2*kk3(3)+kk4(3))/6
        px(kk,i)=px(kk-1,i)+dnt*(kk1(4)+2*kk2(4)+2*kk3(4)+kk4(4))/6
        py(kk,i)=py(kk-1,i)+dnt*(kk1(5)+2*kk2(5)+2*kk3(5)+kk4(5))/6
        pz(kk,i)=pz(kk-1,i)+dnt*(kk1(6)+2*kk2(6)+2*kk3(6)+kk4(6))/6
!=====================================================================
		fvx(1,i)=fvx(2,i)
		fvy(1,i)=fvy(2,i)
!=====================================================================
     dis=xL*sqrt(px(kk,i)**2+py(kk,i)**2)
	 dis0=xl2/dis
	 dis1=xl2/sqrt(px0(kk,i)**2+py0(kk,i)**2)/xL
	 if(dis>xL2)then
	   continue
	 else
	   cosa=xl*px(kk,i)/dis
	   sina=xl*py(kk,i)/dis
	   Px(kk,i)=0.5*(px0(kk,i)*dis1+px(kk,i)*dis0)
	   Py(kk,i)=0.5*(py0(kk,i)*dis1+px(kk,i)*dis0)
	   tvx=pvx(kk,i)
	   tvy=pvy(kk,i)
	   pvx(kk,i)=-(tvx*cosa+tvy*sina)*cosa+(tvx*sina-tvy*cosa)*sina
	   pvy(kk,i)=-(tvx*cosa+tvy*sina)*sina-(tvx*sina-tvy*cosa)*cosa
	 end if
     end do 
	 ti=ti+dnt 
!-----------------颗粒边界条件-------------------
   end if
write(*,*)"kk=",kk,"ti=",ti
!write(*,*)(dvdy(i),i=1,pnum)

end do

DO I=1,NLIMIT
   DO J=1,PNUM
      PVX(I,J)=PVX(I,J)*U
      PVY(I,J)=PVY(I,J)*U
	  PX(I,J)=PX(I,J)*XL
	  PX(I,J)=PX(I,J)*XL
   END DO
END DO
close(110)
end subroutine

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -