Advertisement
rgedies

solver

May 26th, 2023 (edited)
609
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Fortran 14.90 KB | Source Code | 0 0
  1.      subroutine solver(iaba,nnode,inode,coord,&     nelem,ielem,inelem,kpn,kp,istat)
  2.  
  3.       implicit double precision (a-h,o-z)
  4.     parameter (NN=10000)
  5.       dimension inode(*),coord(2,*)
  6.       dimension ielem(4,*),inelem(4,*)
  7.       dimension kp(*)
  8.       dimension  t(NN),told(NN),f(NN),fold(NN)
  9.       dimension  x(2,4),x_g(2,4,nelem),nef(2,4)
  10.       dimension  am_e(4),hg_e(4),n_e(4),al_e(4)
  11.       dimension  cond(NN),conv(NN),hg(NN)
  12.       dimension  am(NN),al(NN),radi(NN)
  13.       dimension  ael(4,NN),stiff(4,4,NN)
  14.       dimension  ctime(4,11),crate(11),t_kp_max(NN)
  15.       dimension  ttmax(NN),cctime(11)
  16.     real*8 time, time_new
  17.       data ((nef(i,j),i=1,2),j=1,4)/1,2,2,3,3,4,4,1/
  18.     REAL*8 XFE1,XPE1,xfe2,xpe2,fc1,pc1,bc1,fc2,pc2,bc2
  19.     REAL*8 AC1_,AC3_1,TDISS1,AE4_1,AE3_1,AE1_1,TBS1,TMS1,as1_1& ,Tliquid1,Tsolid1
  20.     real*8 AC1_2,AC3_2,TDISS2,AE4_2,AE3_2,AE1_2,TBS2,TMS2,as1_2&    ,Tliquid2,Tsolid2  
  21.     dimension PEAK(NN),VR(NN),Tfaren(NN)
  22.     REAL*8 XA(NN),XF(NN),XP(NN),XB(NN),XM(NN),GS(NN),G(NN),HV(NN)&  ,XL(NN)
  23.     INTEGER NMICRO, IMICRO
  24.     REAL*8 TMICRO(NN), TIME_MICRO, TIME_PRINT
  25.     REAL*8 TEMP_HIST(NN,10), TIMES(10), TEMP_4_CR1(NN), TEMP_4_CR2(NN)
  26.  
  27.     dimension nodeflag(nn)
  28.        
  29.     COMMON/TEMPS/AC1_1,AC3_1,TDISS1,AE4_1,AE3_1,AE1_1,TBS1,TMS1,as1_1&  ,Tliquid1,Tsolid1
  30.     COMMON/TEMPS2/AC1_2,AC3_2,TDISS2,AE4_2,AE3_2,AE1_2,TBS2,TMS2,as1_2& ,Tliquid2,Tsolid2
  31.     COMMON/STRUCT/XA,XF,XP,XB,XM,GS,G,HV,XL
  32.     COMMON/KCONST/fc1,pc1,bc1
  33.     COMMON/KCONST2/fc2,pc2,bc2
  34.     COMMON/BASELINE/XFE1,XPE1
  35.     COMMON/BASELINE2/XFE2,XPE2
  36.       include 'common.f'
  37.     common/nodetype/nodeflag
  38.  
  39.       factor_t = 0.5
  40.       itmax = 1000000           ! maximum number of iterations
  41.       cnv = 0.050
  42.       zero = 0.0d0
  43.       one = 1.0d0
  44.       three = 3.0d0
  45.       pi = dacos(-1.0d0)
  46.  
  47.       if (iaba .eq. 1) then
  48.         open(101,file='temp.dat')
  49.         open(103,file='t-hist.dat')
  50.         OPEN (104,FILE ='TEMP_PRINT.DAT')
  51.         write(103,*)  "time", 1,55,140,699
  52.       endif
  53.  
  54.       call init(nelem,ielem,inelem, &     nnode,t,told,f,fold)
  55.     DO I = 1, NNODE
  56.         COND(I) = 0.0D0
  57.         CONV(I)= 0.0D0
  58.         AM(I) = 0.0D0
  59.         AL(I) = 0.0D0
  60.         HG(I) = 0.0D0
  61.         RADI(I) = 0.0D0
  62.     END DO
  63.  
  64.     NMICRO = 50
  65.     IMICRO = 0
  66.     DO I = 1, NNODE
  67.         TMICRO(I) = TOLD(I)
  68.     END DO
  69.     TIME_MICRO=0.0D0
  70.     TIME_PRINT = 1.0D1
  71.     IPRINT = 0
  72.       call assemble(nnode,inode,coord,nelem,ielem,&     inelem,ael,x_g,stiff)
  73.       if (id_conf .gt. 0) then
  74.          if (id_m(3) .eq. 1) then
  75.             anc = 3.0
  76.          elseif (id_m(3) .eq. 2) then
  77.             anc = 5.0
  78.          else
  79.             anc = 4.0
  80.          endif
  81.  
  82.          pmax = 2*heat_in*sqrt(three/pi)/area_w/((one+anc)*r_cc)
  83.          incp = 1000
  84.          weldtime = (1+anc)*r_cc/speed
  85.          deltmx = 15.0
  86.          write(6,2) 'Estimated maximum heating time =',weldtime,&        'seconds.'
  87.       else
  88.          deltmx = 5.0d0
  89.          weldtime = 60.
  90.          incp = 100
  91.       endif
  92.  
  93.       do i=1,nnode
  94.          ttmax(i) = t(i)
  95.       enddo
  96.  
  97.       do i=1,kpn
  98.          ctime(1,i) = zero
  99.          ctime(2,i) = zero
  100.          ctime(3,i) = zero
  101.          ctime(4,i) = zero
  102.          crate(i) = zero
  103.          t_kp_max(i) = t(kp(i))
  104.       enddo
  105.  
  106.       inc = 0                   ! iteration count for printing out
  107.       itc = 0                   ! iteration count for the analysis
  108.       time = 0.0d0
  109.       hmesh = 1.0d8
  110.       do i=1,nelem
  111.          if ((ielem(2,i) .eq. 3) .or. (id_conf .eq. 0)) then
  112.             x1 = coord(1,inelem(1,i))
  113.             y1 = coord(2,inelem(1,i))
  114.             x2 = coord(1,inelem(2,i))
  115.             y2 = coord(2,inelem(2,i))
  116.             x3 = coord(1,inelem(3,i))
  117.             y3 = coord(2,inelem(3,i))
  118.             x4 = coord(1,inelem(4,i))
  119.             y4 = coord(2,inelem(4,i))
  120.             dist1 = (x2-x1)**2 + (y2-y1)**2
  121.             dist2 = (x3-x2)**2 + (y3-y2)**2
  122.             dist3 = (x4-x3)**2 + (y4-y3)**2
  123.             dist4 = (x1-x4)**2 + (y1-y4)**2
  124.             hmesh = min(hmesh,dist1,dist2,dist3,dist4)
  125.          endif
  126.       enddo
  127.  
  128.       if (id_conf .eq. 0) then
  129.          tk_w = tk(tcr1,id_m(1))
  130.          cp_w = cp(tcr1,id_m(1))
  131.          dens_w = dens(id_m(1))
  132.       else
  133.          t_weld = t0_p
  134.          tk_w = tk(t_weld,id_m(3))
  135.          cp_w = cp(t_weld,id_m(3))
  136.          dens_w = dens(id_m(3))
  137.       endif
  138.       vmu = tk_w/dens_w/cp_w
  139.       dtmax = 2.0D0*factor_t*hmesh/vmu
  140.       dtmin = dtmax*1.0d-4
  141.  
  142.       write(6,2) 'Minumun element size =',hmesh,'mm'
  143.       write(6,2) 'Maximum time increment =',dtmax,'sec'
  144.       write(6,2) 'Minimum time increment =',dtmin,'sec'
  145.       write(6,2) 'Analysis in progress!'
  146.       write(6,'(1x,A,A)') '   TIME   TEMP. CHANGE       DTIME',&     '   MAX. TEMP     ITERATIONS'
  147.  2    format(1x,A,1x,G8.2,1x,A)
  148.  
  149.       dtime = 1.5d0*dtmax
  150.       z_blayer_old = -500.0D0
  151.  
  152.  100  inc = inc+1
  153.  200  z_blayer = -500.0D0
  154.       itc = itc+1
  155.       time_new = time + dtime      ! trial time for this time increment
  156.       do i=1,nnode
  157.          am(i) = zero
  158.          hg(i) = zero
  159.          al(i) = zero
  160.          cond(i) = zero
  161.          conv(i) = zero
  162.          radi(i) = zero
  163.       enddo
  164.  
  165.       do 300 i=1,nelem
  166.          id = ielem(2,i)        ! material ID of the element
  167.          do ii=1,4        
  168.             n_e(ii) = inelem(ii,i)
  169.          enddo
  170.          tavg = zero
  171.          do ii=1,4
  172.             tavg = tavg + 0.25d0*told(n_e(ii))            
  173.          enddo
  174.          tk_e = tk(tavg,id_m(id))
  175.          cp_e = cp(tavg,id_m(id))
  176.          dens_e = dens(id_m(id))
  177.          xcenter = zero
  178.          ycenter = zero
  179.          do jj=1,4
  180.             do ii=1,2
  181.                x(ii,jj) = coord(ii,n_e(jj))
  182.             enddo
  183.             xcenter = xcenter + 0.25d0*x(1,jj)
  184.             ycenter = ycenter + 0.25d0*x(2,jj)
  185.          enddo
  186.  
  187.          if ((id .eq. 3) .and. (time_new .le. weldtime)) then
  188.             call dflux(power,time_new,anc,pmax,weldtime)
  189.          else
  190.             power = zero
  191.          end if
  192.  
  193.          do ii=1,4
  194.             hg_e(ii) = power*ael(ii,i)
  195.             am_e(ii) = cp_e*dens_e*ael(ii,i)
  196.             al_e(ii) = 0.5d0*ael(ii,i)*dens_e*hf(id_m(id)) &           *(f(n_e(ii))-fold(n_e(ii)))/dtime
  197.          enddo
  198.          do ii=1,4
  199.             sum = zero  
  200.             do jj=1,4
  201.                sum = sum + tk_e*stiff(ii,jj,i)*told(n_e(jj))
  202.             enddo
  203.             cond(n_e(ii)) = cond(n_e(ii)) + sum    
  204.          enddo
  205.          do ii=1,4
  206.             am(n_e(ii)) = am(n_e(ii)) + am_e(ii)
  207.             al(n_e(ii)) = al(n_e(ii)) + al_e(ii)
  208.             hg(n_e(ii)) = hg(n_e(ii)) + hg_e(ii)
  209.          enddo
  210.  
  211.          if (ielem(3,i) .eq. 1) then
  212.  
  213.             nface = ielem(4,i)
  214.             n1 = nef(1,nface)
  215.             n2 = nef(2,nface)
  216.             x1 = x(1,n1)
  217.             x2 = x(1,n2)
  218.             y1 = x(2,n1)
  219.             y2 = x(2,n2)
  220.             xavg = (x1+x2)*0.5d0
  221.             yavg = (y1+y2)*0.5d0
  222.             t1 = told(n_e(n1))
  223.             t2 = told(n_e(n2))
  224.             tavg = 0.5*(t1+t2)
  225.             flux = zero
  226.             if (id_conf .eq. 0) then
  227.                if ((ttmax(kp(1)) .lt. (tcr1+75.0d0))&              .and. (xavg .le. 25.4d0)) then
  228.                   call sflux(flux,xavg)
  229.                else
  230.                   call fflux(flux,tavg)
  231.                endif
  232.             else
  233.                if (id .eq. 3) then
  234.                   if (time_new .gt. weldtime+5.0d0) then
  235.                      call fflux(flux,tavg)
  236.                   endif
  237.                elseif (tavg .lt. ts(id_m(id))) then
  238.                   call fflux(flux,tavg)
  239.                endif
  240.             endif
  241.  
  242.             ds = sqrt((y2-y1)**2 + (x2-x1)**2)
  243.             hloss = 0.5d0*ds*flux*xavg
  244.             conv(n_e(n1)) = conv(n_e(n1))+hloss
  245.             conv(n_e(n2)) = conv(n_e(n2))+hloss
  246.  
  247.          elseif (ielem(3,i) .eq. 2) then
  248.  
  249.             nface = ielem(4,i)
  250.             n1 = nef(1,nface)
  251.             n2 = nef(2,nface)
  252.             x1 = x(1,n1)
  253.             x2 = x(1,n2)
  254.             y1 = x(2,n1)
  255.             y2 = x(2,n2)
  256.             xavg = (x1+x2)*0.5d0
  257.             t1 = told(n_e(n1))
  258.             t2 = told(n_e(n2))
  259.             tavg = 0.5d0*(t1+t2)
  260.             if (id_conf .eq. 2) then ! branch to pipe configuration
  261.                zzz = (x1+x2)*0.5d0
  262.             else
  263.                zzz = (y1+y2)*0.5d0
  264.             endif
  265.             if (tavg .gt. (t0_f+1.0d0)) then
  266.                z_blayer = dmax1(z_blayer,zzz)
  267.             endif
  268.             dist = z_blayer_old-zzz
  269.             if (dist .le. 0.5d0) dist=1.0d8
  270.             call h(dist,tavg,h_c,id_f)
  271.             ds = sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1))
  272.             hloss = 0.5*ds*h_c*xavg*(tavg-t0_f)
  273.  
  274.             conv(n_e(n1)) = conv(n_e(n1)) + hloss
  275.             conv(n_e(n2)) = conv(n_e(n2)) + hloss
  276.          endif
  277.  300  continue
  278.  
  279.       delt = zero
  280.       tmax = zero
  281.       do i=1,nnode
  282.          t(i) = told(i) + dtime*(hg(i)-cond(i)&        -conv(i)-al(i))/am(i)
  283.          delt = dmax1(delt,dabs(t(i)-told(i)))
  284.          tmax = max(tmax,t(i))
  285.       enddo
  286.  
  287.       if (delt .gt. max(deltmx,cnv*tmax)) then
  288.          if (dtime .gt. dtmin) then
  289.             dtime = 0.75d0*dtime
  290.             if (dtime .lt. dtmin) dtime = dtmin
  291.             goto 200
  292.          else
  293.             write(6,*) inc,time,dtime,tmax
  294.             write(6,*) delt,max(deltmx,cnv*tmax)
  295.             istat = 0
  296.             goto 900
  297.          endif
  298.       endif
  299.  
  300.       do i=1,kpn
  301.          ii = kp(i)
  302.          if (t(ii) .gt. t_kp_max(i)) then
  303.             t_kp_max(i) = t(ii)
  304.           cycle
  305.          endif
  306.  
  307.          if ((told(ii) .ge. tcr1) &        .and. (t(ii) .lt. tcr1)&        .and. (ctime(1,i) .lt. 1.0d-6)) then
  308.             fac=(tcr1-told(ii))/(t(ii)-told(ii))
  309.             ctime(1,i)=time+fac*dtime
  310.          endif
  311.  
  312.          if ((ctime(1,i) .gt. 1.0d-6) &        .and. (told(ii) .gt. tcr2)&        .and. (t(ii) .le. tcr2)) then
  313.             fac=(tcr2-told(ii))/(t(ii)-told(ii))
  314.             ctime(2,i)=time+fac*dtime
  315.             cctime(i)=ctime(2,i)-ctime(1,i)
  316.          endif
  317.  
  318.          if ((told(ii) .ge. tcr3+5.d0)  &        .and. (t(ii) .lt. tcr3+5.d0)) then
  319.             fac=(tcr3+5.d0-told(ii))/(t(ii)-told(ii))
  320.             ctime(3,i)=time+fac*dtime
  321.          endif
  322.  
  323.          if ((ctime(3,i) .gt. zero)&        .and. (told(ii) .gt. tcr3-5.d0)&        .and. (t(ii) .le. tcr3-5.d0)) then
  324.             fac=(tcr3-5.d0-told(ii))/(t(ii)-told(ii))
  325.             ctime(4,i)=time+fac*dtime
  326.             crate(i)=10.d0/(ctime(4,i)-ctime(+3,i))
  327.          endif
  328.  
  329.          if ((iaba .eq. 1)&        .and. (i .eq. 1)) then
  330.             write(101,3) time_new,t(ii),(told(ii)-t(ii))/dtime
  331.          endif
  332.       enddo
  333.  
  334.  3    format(1x,ES11.4,',',2x,F8.2,2x,ES12.4)
  335.  
  336.     if ( oldmesher .gt. 0.5d0 ) then
  337.     IMICRO = IMICRO + 1
  338.     IF ( IMICRO .EQ. NMICRO ) THEN
  339.         call MicrostructureTransition(TIME_MICRO,time_new, TMICRO,t&        , peak, vr,nnode)
  340.         IMICRO = 0
  341.         DO I = 1, NNODE
  342.             TMICRO(I) = T(I)
  343.         END DO
  344.         TIME_MICRO = TIME_NEW
  345.     END IF
  346.     end if
  347.  
  348.     IF ( IPRINT .EQ. 0 .AND. TIME .GT. TIME_PRINT) THEN
  349.     IPRINT = 1
  350.     DO I = 1, NNODE
  351.     WRITE(104, 996) I, T(I)-told(i)
  352.     END DO
  353.  
  354.     END IF
  355.  
  356.     deltaT = time_new - time
  357.       time=time_new
  358.       z_blayer_old=z_blayer
  359.  
  360.       do i=1,nnode
  361.          told(i)=t(i)
  362.          if (id_conf .ne. 0) then
  363.             fnew=1.5d0*f(i)-0.5d0*fold(i)
  364.             if (fnew .lt. 0.0d0) fnew=0.0d0
  365.             if (fnew .gt. 1.0d0) fnew=1.0d0
  366.             fold(i)=f(i)
  367.             f(i)=tff(t(i),id_m(id))
  368.             f(i)=(f(i)+fnew)*0.5d0
  369.          endif
  370.          ttmax(i)=max(ttmax(i),t(i))  ! maximum temp at this node
  371.       enddo
  372.  
  373.       if (inc .eq. incp) then
  374.          inc=0
  375.          write(6,5) time,delt,dtime,tmax,itc, z_blayer_old
  376.          write(12,5) time,delt,dtime,tmax,itc,z_blayer_old
  377.       endif
  378.    
  379. 5     format(F8.3,5x,ES10.4,2x,ES10.4,2x,ES10.4,5x,I10, F12.5)
  380. 995   format(1X, 6e12.7)
  381.     write(103,995)  time, t(1), t(55), t(140), t(699)
  382. 996 FORMAT(1X, I10, ",", E15.5)
  383.  
  384.       if (id_conf .eq. 0) then
  385.          if ((t_kp_max(1) .lt. (tcr1+75.d0))&        .or. (tmax .gt. tcr2-25.)) then
  386.             dtime=min(dtime*1.15,dtmax)
  387.             goto 100
  388.          endif
  389.       else
  390.          if (time .lt. weldtime) goto 100
  391.          if (tmax .gt. tcr2-100.) then
  392.             dtime = min(dtime*1.15,dtmax)
  393.             goto 100
  394.          endif
  395.       endif
  396.  
  397.       write(6,5) time,delt,dtime,tmax,itc
  398.       write(12,5) time,delt,dtime,tmax,itc
  399.  
  400.     hdmax1 = 0.0d0
  401.     hdmax2 = 0.0d0
  402.     do i = 1, nnode
  403.         if (nodeflag(i) .eq. 1) then
  404.             if ( hv(i) .gt. hdmax1 ) hdmax1 = hv(i)
  405.         end if
  406.         if (nodeflag(i) .eq. 2) then
  407.             if ( hv(i) .gt. hdmax2 ) hdmax2 = hv(i)
  408.         end if
  409.     end do
  410.  
  411.       if (id_conf .eq. 0) then
  412.          call post2(iaba,kpn,cctime,crate,t_kp_max,kp)
  413.       else
  414.        if ( oldmesher .lt. 0.5d0 ) then
  415.         call post1(iaba,kpn,cctime,crate,t_kp_max,kp)
  416.        else
  417.         call post3(iaba,kpn,cctime,crate,t_kp_max,kp,hdmax1,hdmax2)
  418.        end if        
  419.       endif
  420.  
  421.  900  if (iaba .eq. 1) then
  422.          open(102,file='tmax.dat')
  423.          do i=1,nnode
  424.             write(102,25) i, ttmax(i)
  425.          enddo
  426.          close(102)
  427.  
  428.         open(20,file = 'hardness.txt')
  429.         do i = 1,nnode
  430.             write(20,26) i, coord(1,i), coord(2,i), peak(i), vr(i)&         , hv(i)
  431.         end do 
  432.         open(201,file = 'Tpeak.out')
  433.         do i = 1,nnode
  434.             write(201,27) i, peak(i)
  435.         end do
  436.         open(202,file = 'Vr.out')
  437.         do i = 1,nnode
  438.             write(202,27) i, vr(i)
  439.         end do
  440.         open(203,file = 'Hv.out')
  441.         do i = 1,nnode
  442.             write(203,27) i, hv(i)
  443.           end do
  444.         open(204,file = 'Tfaren.out')
  445.         do i = 1,nnode
  446.               Tfaren(i)=peak(i)*1.8+32
  447.             write(204,27) i, Tfaren(i)
  448.         end do        
  449.       endif
  450.  25   format (i8,', ', ES14.6)
  451.  26 FORMAT (1X, I10, 5F15.5)
  452.  27   format (i8,', ', F15.5)
  453.  
  454.       istat=1
  455.  
  456.     CLOSE (20)
  457.     CLOSE (201)
  458.     CLOSE (202)
  459.     CLOSE (203)    
  460.     CLOSE (204)
  461.       return
  462.       end
  463.     SUBROUTINE UPDATE_TEMPERATURE_HISTORY(TEMP_HIST,TIMES,T,TIME&   ,NNODE)
  464.     IMPLICIT REAL*8 (A-H,O-Z)
  465.     parameter (NN=10000)
  466.     REAL*8 TEMP_HIST(NN,*), T(NN), TIMES(*), TIME
  467.     INTEGER IPOINTER, NNODE
  468.  
  469.     IPOINTER = 0
  470.     DO I = 1, 8
  471.         IF ( TIMES(I) .LT. 1.0D-12 ) THEN
  472.             IPOINTER = I
  473.             GOTO 100
  474.         END IF
  475.     END DO
  476. 100 CONTINUE
  477.     IF ( IPOINTER .EQ. 0 ) IPOINTER = 8
  478.     IF ( IPOINTER .LT. 8 ) THEN
  479.         DO I = 1,NNODE
  480.             TEMP_HIST(I,IPOINTER) = T(I)
  481.             TIMES(IPOINTER) = TIME
  482.         END DO
  483.     ELSE
  484.         DO J = 1,7
  485.             DO I = 1,NNODE
  486.                 TEMP_HIST(I,J) = TEMP_HIST(I,J+1)
  487.                 TIMES(J) = TIMES(J+1)
  488.             END DO
  489.         END DO
  490.         DO I =1, NNODE
  491.             TEMP_HIST(I,8) = T(I)
  492.             TIMES(8) = TIME
  493.         END DO
  494.     END IF
  495.  
  496.     IF ( IPOINTER .LT. 8 ) THEN
  497.         DO I =1, NNODE
  498.             TEMP_HIST(I,9) = T(I)
  499.             TEMP_HIST(I,10) = T(I)
  500.         END DO
  501.     ELSE
  502.         TSUM1 = 0.0D0
  503.         TSUM2 = 0.0D0
  504.         DO I = 1, 8
  505.             TSUM1 = TSUM1 + TIMES(I)
  506.             TSUM2 = TSUM2 + TIMES(I)*TIMES(I)
  507.         END DO
  508.         DO I =1, NNODE
  509.             ASUM = 0.0D0
  510.             BSUM = 0.0D0
  511.             DO J = 1,8
  512.                 ASUM = ASUM + TEMP_HIST(I,J)
  513.                 BSUM = BSUM + TEMP_HIST(I,J)*TIMES(J)
  514.             END DO
  515.             COEFB = (BSUM-TSUM1*ASUM/8)/(TSUM2-TSUM1*TSUM1/8)
  516.             COEFA = (ASUM-COEFB*TSUM1)/8.0D0
  517.             TEMP_HIST(I,9) = COEFA + COEFB*TIMES(7)
  518.             TEMP_HIST(I,10) = COEFA + COEFB*TIMES(8)
  519.         END DO
  520.     END IF 
  521.  
  522.     RETURN
  523.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement