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

📄 reconfea2005.f90

📁 康清良老师编制的非线性有限元程序(2)
💻 F90
📖 第 1 页 / 共 4 页
字号:

	  do j=1,NFelem
	     EFJtno=G_EFJtno(:,j)
         
		 EFStif=0.0
		 tmp1=abs(FYB(1,j))	 
		 tmp2=pi*feltprop(1,FType(j))*feltprop(2,FType(j))		 
		 if (FState(j)==1) then
		    if (curvetype==1) then
			   EsL=9.81e2-11.5e4*tmp1+2.51e6* tmp1**2
			else
			   Esl=(5.3e2-5.04e4*tmp1+17.6e5*tmp1**2-21.9e6*tmp1**3)/sqrt(Fcu*0.67/40.7)
			end if
			KH=Esl*tmp2
			Kv=feltprop(4,FType(j))*feltprop(2,FType(j)) !kv=Ec×Lm
		else
		   KH=10.0
		   kv=feltprop(4,FType(j))*feltprop(2,FType(j)) !kv=Ec×Lm
	    end if        
		c=cos(feltprop(3,FType(j))*pi/180)
		s=sin(feltprop(3,FType(j))*pi/180)
        call shape_flet_stif(c,s,kh,kv,EFStif)	
						    
        EFdof=G_EFdof(:,j) 						  
        call shape_Astif(kcol,EFStif,EFdof,4) 
	  end do      
!集装总刚结束
      do j=1,ntotv
	     if (kcol(j)%row(j)<1e-4) then
		    go to 100
		 endif
	  end do
	  G_load=Ub_G_load	  
      Ub_G_load=0.0
	  call Varbandsolv(Kcol,G_load,Ntotv)
	  G_load(0)=0.0
	  All_dis=All_dis+G_load
	  write(11,*) "+++++++=="
      write(11,*) all_dis(124)	 
	     do j=1,ntotv
		    if (abs(All_dis(j))>1000) then
			   goto 100
			end if
		 end do         
		  do j=1,NSelem   !钢筋单元的分析
		    ESJtno=G_ESJtno(:,j)
		    ESdof=G_ESdof(:,j)
			ESdis(:)=G_load(ESdof)
            ESCoord=G_Pcoord(:,ESJtno)
		    if (SState(j)==1) then  !弹性阶段
		       Es=steprop(1,SType(j))
		    else
		       Es=10             !水平段了
		    end if
            c=ESCoord(1,2)-ESCoord(1,1)
			s=ESCoord(2,2)-ESCoord(2,1)
			L=sqrt(c*c+s*s)
			c=c/L
			s=s/l
			SYL(j)=SYL(j)+Es*(-c*ESdis(1)-s*ESdis(2)+c*ESdis(3)+s*ESdis(4))/L !存第二点轴应力,拉为正
			tmp1=10     
		    if (abs(SYL(j))<steprop(3,SType(j))) then
			   SState(j)=1
			else
			   if (sstate(j)==1) then			      
			   destroynum=destroynum+1		
			   end if
			   SState(j)=2			   
               if (SYL(j)>0) then
			      tmp1=(SYL(j)-steprop(3,SType(j)))*steprop(2,SType(j))
                  SYL(j)=steprop(3,SType(j))
			   else
			      tmp1=(SYL(j)+steprop(3,SType(j)))*steprop(2,SType(j))
				  SYL(j)=-steprop(3,SType(j))
			   end if
	           ESF(1)=-tmp1*c
			   ESF(2)=-tmp1*s
			   ESF(3)=tmp1*c
			   ESF(4)=tmp1*s
			   Ub_G_load(ESdof)=Ub_G_load(ESdof)+ESF	
			   continue     
			end if               
 		 end do
		 do j=1,NFelem !粘结单元
		    EFJtno=G_EFJtno(:,j)
		    EFdof=G_EFdof(:,j)
			EFdis(:)=G_load(EFdof)
   		    tmp1=abs(FYB(1,j))	 
		    tmp2=pi*feltprop(1,FType(j))*feltprop(2,FType(j))		 
		    if (FState(j)==1) then
		       if (curvetype==1) then
			      EsL=9.81e2-11.5e4*tmp1+2.51e6* tmp1**2
		   	   else
			      Esl=(5.3e2-5.04e4*tmp1+17.6e5*tmp1**2-21.9e6*tmp1**3)/sqrt(Fcu*0.67/40.7)
			   end if
			   KH=Esl*tmp2
		   	   Kv=feltprop(4,FType(j))*feltprop(2,FType(j)) !kv=Ec×Lm
	    	else			   
		       KH=10.0
		       kv=feltprop(4,FType(j))*feltprop(2,FType(j)) !kv=Ec×Lm
	        end if
            c=cos(feltprop(3,FType(j))*pi/180)
			s=sin(feltprop(3,FType(j))*pi/180)
            EFYB(1)=-c*EFdis(1)-s*EFdis(2)+c*EFdis(3)+s*EFdis(4)  !增量
			EFYB(2)=s*EFdis(1)-c*EFdis(2)-s*EFdis(3)+c*EFdis(4)              			
			FYB(1,j)=FYB(1,j)+EFYB(1)  !粘结单元的应变H或称位移  总的
			FYB(2,j)=FYB(2,j)+EFYB(2)   !粘结单元的应变v
            !此fyb是某个荷载步的应变,不是总应变,这样才是总应变           
            if (Fstate(j)==1) then
			   FForec(1,j)=FForec(1,j)+KH*EFYB(1)  !!粘结单元的力H
			   FForec(2,j)=FForec(2,j)+Kv*EFYB(2) !!粘结单元的力V		    
			   FYL(j)=FForec(1,j)/tmp2  !H方向的应力
             end if
			!以下是粘结单元的分析
			if (curvetype==1) then
			   s0=0.011   
			   tmax=4.96
			else
			   s0=0.03
			   tmax=4.64*sqrt(Fcu*0.67/40.7)
			end if            
			tmp1=abs(FYB(1,j))  ! 刷新应变
			if (tmp1<s0) then
			   FState(j)=1
			   if(curvetype==1) then
			      R_FYL(j)=9.81e2*tmp1-5.74e4*tmp1**2+0.837e6*tmp1**3
			   else
			      R_FYL(j)=(5.3e2*tmp1-2.52e4*tmp1**2+5.87e5*tmp1**3-5.47e6*tmp1**4)*sqrt(Fcu*0.67/40.7)
			   end if
			   if (FYB(1,j)<0) R_FYL(j)=-R_FYL(j)   			   
			   tmp3=FForec(1,j)-R_FYL(j)*tmp2               			   
			   FForec(1,j)=R_FYL(j)*tmp2
               FYL(j)=R_FYL(j)
			else
			   if (fstate(j)==1) then			      
			   destroynum=destroynum+1		
			   end if
			   FState(j)=2			  
			   if (FYB(1,j)<0) Tmax=-tmax
               tmp3=FForec(1,j)-tmax*tmp2               
			   FForec(1,j)=tmax*tmp2
               FYL(j)=tmax
		    end if
			EFF(1)=-tmp3*c
			EFF(2)=-tmp3*s
			EFF(3)=tmp3*c
		  	EFF(4)=tmp3*s
			Ub_G_load(EFdof)=Ub_G_load(EFdof)+EFF  			            
		 end do
         do j=1,NCelem !混凝土单元单元分析
		    if (j==9) then
			continue
			end if
		    ECJtno=G_ECJtno(:,j)
		    Ecdof=G_Ecdof(:,j)
			ECdis(:)=G_load(Ecdof)
            Eccoord=G_Pcoord(:,ECJtno)
			call shape_T3_B(Eccoord,Bmatx,area)
			ECYB=matmul(Bmatx,ECdis)   !单元当前步的应变
			CYB(:,1,j)=CYB(:,1,j)+ECYB  !所有单元当前步的应变
			tmp1=0.5*sqrt((CYB(1,1,j)-CYB(2,1,j))**2+CYB(3,1,j)**2)			
			C_main_YB(1,1,j)=(CYB(1,1,j)+CYB(2,1,j))*0.5+tmp1
            C_main_YB(2,1,j)=(CYB(1,1,j)+CYB(2,1,j))*0.5-tmp1  !主应变
            thera=CYL(6,1,j)        
			call D_matrix_2d_plane(type2,Dmatx,e(1,1,j),e(2,1,j),pu(1,j))          	       
		    call shape_YL_translate_matrix(thera,T)	        			
			Dmatx=matmul(matmul(T,dmatx),transpose(T))					
			ECYL=matmul(Dmatx,ECYB)			
			CYL(1:3,1,j)=CYL(1:3,1,j)+ECYL  !累加的应力			
			tmp1=CYL(1,1,j)+CYL(2,1,j)			
			tmp2=sqrt((CYL(1,1,j)-CYL(2,1,j))**2+4*CYL(3,1,j)**2)			
			CYL(4,1,j)=(tmp1+tmp2)*0.5
			CYL(5,1,j)=(tmp1-tmp2)*0.5			
			Tx=CState(1,j)/10			
			Ty=CState(1,j)-10*Tx	
			oldstate=cstate(1,j)									
			if(Tx>=2 .or. Ty>=2) then
			   angle=cyl(6,1,j)
			   goto 2000  !非弹性状态11
            end if 
            tmp3=CYL(2,1,j)-CYL(5,1,j)
			if (abs(tmp3)<1e-4) then
			      angle=0.0
			else
			  angle=90-57.296*atan(CYL(3,1,j)/tmp3)
			end if            !求角度
2000        tmp1= ECYL(1)+ECYL(2)
            tmp2=sqrt((ECYL(1)-ECYL(2))**2+4*ECYL(3)**2)			
			tmp3=(tmp1+tmp2)*0.5
			tmp4=(tmp1-tmp2)*0.5            
            if ( abs(cyl(6,1,j)-angle)<45 .or. abs(cyl(6,1,j)-angle+180)<45 .or. abs(cyl(6,1,j)-angle-180)<45) then
			   siu(1,1,j)=siu(1,1,j)+tmp3/E(1,1,j) 
			   siu(2,1,j)=siu(2,1,j)+tmp4/E(2,1,j)  !等效单向应变的累加
            else
			   tmp5=siu(1,1,j)
			   siu(1,1,j)=siu(2,1,j)+tmp3/e(1,1,j)
			   siu(2,1,j)=tmp5+tmp4/e(2,1,j)   
			end if
            cyl(6,1,j)=angle
			if (CState(1,j)==11) then
			   call kupf(Fcu,CYL(:,:,j),Fz(:,:,j))  !算破坏应力
			end if						
	        fc=-Fcu*0.667		   
            if (CYL(5,1,j)<0.0 .and. CYL(4,1,j)<0.0) then  !双压
			   if (abs(CYL(5,1,j))<abs(fz(2,1,j))) then			      
			      call saenz(1,Fz(:,:,j),Fc,sic(:,:,J),siu(:,:,J),E(:,:,j),R_CYL(:,:,J),Eo,cyl(:,1,j)) !算E和真实应力
				  CState(1,j)=11
				  pu(1,j)=0.2
				  sl(1)=R_CYL(1,1,j)
				  sl(2)=R_CYL(2,1,j)
				else
				  do k=1,2
				     if (abs(siu(k,1,j))<abs(4*sic(k,1,j)) .and. abs(siu(k,1,j))>=abs(sic(k,1,j))) then
					    sl(k)=fz(k,1,j)-(0.8*fz(k,1,j)*(siu(k,1,j)-sic(k,1,j)))/(3.0*sic(k,1,j))      			            
						CState(1,j)=22						
					 else if (abs(siu(k,1,j))>abs(4*sic(k,1,j))) then
                        sl(k)=0.0
                        CState(1,j)=33						
					end if			
				  enddo
				  E(:,1,j)=10
				  pu(1,j)=0.2
               end if
			elseif (CYL(4,1,j)>=0.0 .and. CYL(5,1,j)<0.0) then  !拉压
			   if (abs(CYL(4,1,j))<abs(fZ(1,1,j))) then
		          call saenz(2,Fz(:,:,j),Fc,sic(:,:,J),siu(:,:,J),E(:,:,j),R_CYL(:,:,J),Eo,cyl(:,1,j))
                  R_CYL(1,1,j)=CYL(4,1,j)
				  sl(1)=R_CYL(1,1,j)
				  sl(2)=R_CYL(2,1,j)
				  CState(1,j)=11
				  pu(1,j)=0.2
			   else 
			      Eiu=abs(siu(1,1,j))
			      Etu=0.00015
				  if (eiu<etu .and. eiu>=abs(Fz(1,1,j)/Eo)) then
				     sl(1)=fz(1,1,j)
					 tx=2					 
                  else if(eiu>=etu) then
				     sl(1)=0.0
					 tx=3				     					 
				  end if  			
			      E(1,1,j)=10
				  pu(1,j)=0.2
				  !以下是受压
				  Eiu=abs(siu(2,1,j))
				  Ecu=0.0033
				  Ec0=0.002
				  if (eiu<Ec0) then
				     Es=abs(Fc/Ec0)
					 q=eiu/Ec0
					 s=1+(Eo/es-2.0)*q+q**2
					 E(2,1,j)=eo*(1.0-q**2)/s**2
					 sl(2)=-eo*eiu/s
					 ty=1
				  elseif (eiu>=ec0 .and. eiu<ecu)then
				     e(2,1,j)=10
					 sl(2)=fc-0.8*fc*(eiu-ec0)/(ecu-ec0)
					 ty=2					 
                  else
				     sl(2)=0.0
					 e(2,1,j)=10
					 ty=3								    
				  end if					 			   
			   end if			   
               pu(1,j)=0.2
			   CState(1,j)=10*tx+ty			
			elseif (CYL(4,1,j)>=0.0 .and. CYL(5,1,j)>=0.0) then  !双拉
			   if (abs(CYL(4,1,j))<abs(fz(1,1,j))) then
			      sl(1)=CYL(4,1,j)
				  sl(2)=CYL(5,1,j)
				  CState(1,j)=11
			   else
			      eiu=abs(siu(1,1,j))
				  etu=0.00015
				  if (eiu>=abs(fz(1,1,j)/Eo) .and. eiu<etu) then
				     sl(1)=fz(1,1,j)
					 tx=2					 
				   elseif (eiu>=etu) then
				      sl(1)=0.0
					  tx=3					 
				   end if				 
				   e(1,1,j)=0.0
				   pu(1,j)=0.2
				   !小主应力方向
				   eiu=abs(siu(2,1,j))
				   if (abs(CYL(5,1,j))<abs(fz(2,1,j)) .or. eiu<abs(fz(2,1,j)/Eo)) then
				      sl(2)=CYL(5,1,j)
					  ty=1
					  e(2,1,j)=eo  !这句不写我觉得更好
					  pu(1,j)=0.2
				   elseif (eiu>=abs(fz(2,1,j)/eo) .and. eiu<etu) then
				      sL(2)=fz(2,1,j)
					  ty=2					 
					  E(2,1,j)=10
					  pu(1,j)=0.2
				   else
				      sl(2)=0
					  ty=3					  
					  E(2,1,j)=10
					  pu(1,j)=0.2
                   end if
			      CState(1,j)=10*tx+ty			
               end if
			end if	
			if (oldstate/=cstate(1,j)) then
			   destroynum=destroynum+1
			end if
			thera=cyl(6,1,j)
			call shape_YL_translate_matrix(thera,T)														   		  
		    yl4(1)=CYL(4,1,j)-sl(1)
		    yl4(2)=CYL(5,1,j)-sl(2)
		    yl4(3)=0.0
		    yl1=matmul(T,yl4)
	   	    call shape_T3_B(Eccoord,Bmatx,area)     
		    yl3=area*Con_t*matmul(transpose(bmatx),yl1) 
			if (max(abs(maxval(yl3)),abs(minval(yl3)))>20) then
	          continue
	        end if
            Ub_G_load(Ecdof)=Ub_G_load(Ecdof)+yl3		    
			yl4(1)=sl(1)
		    yl4(2)=sl(2)
		    yl4(3)=0.0            
			yl1=matmul(T,yl4)
		    CYL(1:3,1,j)=yl1
		    CYL(4,1,j)=sl(1)
		    CYL(5,1,j)=sl(2)  !这里为什么不进一步算角度 我求			
			IF (CState(1,j)==11)THEN
			   tmp3=CYL(2,1,j)-CYL(5,1,j)
			   if (abs(tmp3)<1e-4) then			   
			      angle=0.0
			   else			  
			      angle=90-57.296*atan(CYL(3,1,j)/tmp3)
			   end if
			   CYL(6,1,J)=ANGLE
		    END IF
		 end do		 		 
         goto 200
	  end if	 	 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
100   continue	
   end do    
end program RcConFea2005

⌨️ 快捷键说明

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