|
|
CODICE Private Sub CONVERG() 'Private Sub CONVERG(NTOTAL As Integer) ' ' ' SUBROUTINE *CONVERG* INPUTS THE CONVERGENCE CRITERIA CONTROLLING ' THE NATURE OF THE THERMAL ANALYSIS. THE PROGRAM CONTAINS THE ' THE CAPABILITIES FOR ITERATIVE SOLUTIONS DEALING WITH THE ENTIRE ' SYSTEM AND/OR THE FIRE BOUNDARY CONDITIONS ' '
'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D,NEL2D, 'NEL3D , NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'COMMON /CONRG/ NCONV,CONV,BETA,NCONU,CONU,ALPHA
'Dim NCONV As Integer 'Dim CONV As Double 'Dim BETA As Double 'Dim NCONU As Integer 'Dim CONU As Double 'Dim ALPHA As Double
' ' OUTPUT PAGE HEADING ' Print #NOUT, "6" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, " FIRES-T3 - FIRE RESPONSE OF STRUCTURES - THERMAL " Print #NOUT, "" Print #NOUT, " "; ITITLE Print #NOUT, "" Print #NOUT, " INFORMATION RELEVANT TO THE ANALYSIS PROCEDURE" Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . . CONVERGENCE CRITERIA . . . ." ' ' CONVERGENCE DETERMINED WHEN ' ' 2*ABS(T(I)-T(I-1)/T(I)+T(I-1) .LESS THAN. CONV OR CONU ' ' AND IF CONVERGENCE IS NOT ACHIEVED THE NEXT ESTIMATE OF THE ' SYSTEMS TEMPERATURES IS OBTAINED THROUGH ' ' T(I+1) = T(I) + BETA (OR ALPHA) *(T(I)-T(I-1)) ' ' WHERE SYSTEM FIRE BC ' CRITERIA CRITERIA ' ' NCONU NCONV - NUMBER OF PERMISSIBLE ' ITERATIONS(0-IF PARTICULAR ' ITERATION IS NOT DESIRED) ' CONU CONV - PERMISSIBLE RELATIVE ERROR ' ALPHA BETA - OVER RELAXATION FACTOR ' ' INPUT CONVERGENCE CRITERIA '
'------------------------------------------------- ' Convergence criteria card (I5,2F10.0,I5,2F10.0) '------------------------------------------------- Line Input #NIN, str_tmp NCONV = Val(Mid$(str_tmp, 1, 5)) 'Maximum number of iterations permitted 'for fire B.C. solution CONV = Val(Mid$(str_tmp, 6, 10)) 'Permissible relative error for fire B.C. 'iteration BETA = Val(Mid$(str_tmp, 16, 10)) 'Overconvergence factor for fire B.C. 'iteration NCONU = Val(Mid$(str_tmp, 26, 5)) 'Maximum number of iterations permitted 'for system solution in each time step 'if NCONU=0, linear solution - no iteration CONU = Val(Mid$(str_tmp, 31, 10)) 'Permissible relative error for system 'iteration ALPHA = Val(Mid$(str_tmp, 41, 10)) 'Overconvergence factor for system 'iteration If NCONU = 0 Then GoTo lab10 ' ' OUTPUT SYSTEM CONVERGENCE CRITERIA ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, " CONVERGENCE CRITERIA FOR ENTIRE SYSTEM" Print #NOUT, "" Print #NOUT, " PERMISSIBLE ERROR ="; CONU Print #NOUT, " MAXIMUM NUMBER OF ITERATIONS ="; NCONU Print #NOUT, " ALPHA ="; ALPHA lab10: ' ' OUTPUT FIRE BOUNDARY CONDITION CONVERGENCE CRITERIA ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, " CONVERGENCE CRITERIA FOR BOUNDARY CONDITIONS" Print #NOUT, "" Print #NOUT, " PERMISSIBLE ERROR ="; CONV Print #NOUT, " MAXIMUM NUMBER OF ITERATIONS ="; NCONV Print #NOUT, " BETA ="; BETA ' ' DIVIDE PERMISSBLE ERROR BY TWO ' CONV = CONV * 0.5 CONU = CONU * 0.5 ' ' ' STORAGE REQUIREMENT FOR BLANK COMMON IS NOW PRINTED ' ' 'Print #NOUT, "" 'Print #NOUT, "" 'Print #NOUT, "" 'Print #NOUT, "" 'Print #NOUT, " . . . . STORAGE REQUIREMENT FOR BLANK COMMON . . . ." 'Print #NOUT, "" 'Print #NOUT, " SIZE BLANK COMMON = ", NTOTAL; " (DECIMAL)" 'Print #NOUT, " = ", Oct(NTOTAL); " (OCTAL)" ' '
End Sub
proseguo spedito nella traduzione, se sbaglio correggetemi.
CODICE Private Sub HEATFLO(X() As Double, Y() As Double, Z() As Double, KODE() As Tipo_KODE, _ D() As Double, MA() As Integer, T1() As Double, T2() As Double, T3() As Double, _ LM() As Integer, MMTYPE() As Integer, BAREA() As Double, THICK() As Double, _ MATL() As Integer, XYS() As Tipo_XYS, MAT() As Integer, FXYS() As Tipo_XYS, _ LI() As Integer, LJ() As Integer, LK() As Integer, LL() As Integer, _ LMAT() As Integer, LFIRE() As Integer, AIJKL() As Double, LELEM() As Integer, _ IEXO() As Integer, EXYS() As Tipo_XYS, IEL() As Integer, IMAT() As Integer, VEL() As Double, _ Q() As Double, T() As Double, B() As Double, AT() As Double, A() As Double, VOLUME() As Double, _ NUMNP As Integer, NUMFBC As Integer) ' ' ' SUBROUTINE *HEATFLO* IS THE THERMAL ANALYSIS CONTROLLER ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'COMMON /EXOTH/ NINT1D,NINT2D,NINT3D,NINT,NQINT 'COMMON /CONRG/ NCONV,CONV,BETA,NCONU,CONU,ALPHA 'DIMENSION X(1), Y(1), Z(1), KODE(1), LM(1), MMTYPE(1), LELEM(1), MATL(1), 'XYS(1), MAT(1), FXYS(1), LI(1), LJ(1), LK(1), LL(1), LMAT(1), LFIRE(1), 'AIJKL(1), Q(1), T(1), B(1), AT(1), A(NP, 1), D(1), MA(1), T1(1), T2(1), 'T3(1), THICK(1), BAREA(1), IEXO(1), EXYS(1), IEL(1), IMAT(1), VEL(1), VOLUME(1) 'DIMENSION TFIRE(4) 'ReDim A(NUMNP, 1) As Double '-----------????? Dim TFIRE(4) As Double ' ' INITIALIZE THE SYSTEM ' Dim MAIN As Integer MAIN = 0 '------------------tex Dim IP1 As Integer Dim IP2 As Integer Dim SDT As Double Dim DS As Double IP1 = 0 IP2 = 0 SDT = 0# DS = 0# ' ' INPUT INITIAL TIME STEP CARD ' WHERE IA - CONTROL WORD (STEP) ' MDT - SEQUENCE COUNTER - INITIAL VALUE ' TIME - SYSTEM CLOCK - INITIAL VALUE ' TEMP - INDICATOR FOR INITIAL TEMPERATURE - IF NON-ZERO ' THEN TAKEN AS UNIFORM INITIAL TEMPERATURE OF SYSTEM ' JP - IDENTIFIER FOR PUNCHED OUTPUT ' Dim IA As String * 4 Dim MDT As Integer Dim TIME As Double Dim TEMP As Double Dim JP As String * 3 Dim blank2 As String * 2
'----------------------------------------------------- ' Initial time step control card (A4,I6,2F10.0,2X,A3) '----------------------------------------------------- Line Input #NIN, str_tmp IA = Mid$(str_tmp, 1, 4) 'Enter the word "STEP" MDT = Val(Mid$(str_tmp, 5, 6)) 'Initial number in sequencing of time 'steps TIME = Val(Mid$(str_tmp, 11, 10)) 'Initial time (i.e., base time) TEMP = Val(Mid$(str_tmp, 21, 10)) 'Uniform initial temperature '(If initial temperature is nonuniform, 'leave cols. 21-30 blank and input nodal 'temperatures on the data card below) blank2 = Mid$(str_tmp, 31, 2) 'blank JP = Mid$(str_tmp, 33, 3) '3-symbol alphanumeric code that will 'appear in columns 74-76 of punched output. ' ' OUTPUT HEADING FOR INITIAL TIME STEP ' Print #NOUT, "6" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, " FIRES-T3 - FIRE RESPONSE OF STRUCTURES - THERMAL" Print #NOUT, "" Print #NOUT, " "; ITITLE ' If IA <> "STEP" Then GoTo lab40 ' Print #NOUT, "" Print #NOUT, " INITIAL SEQUENCE NUMBER IS "; MDT; " AND INITIAL TIME IS "; TIME Print #NOUT, "" Print #NOUT, " ************************************************************" ' ' INITIALIZE TEMPERATURES ' If TEMP <> 0# Then GoTo lab10 Dim I As Integer Dim blank4 As String * 4
'----------------------------------------------------- ' Initial Temperature Distribution Data (7(4X,F6.1)) '----------------------------------------------------- For I = 1 To NUMNP Step 7 Line Input #NIN, str_tmp If I > NUMNP Then Exit For blank4 = Mid$(str_tmp, 1, 4) 'blank T(I) = Val(Mid$(str_tmp, 5, 6)) 'Initial temperature at node I If I + 1 > NUMNP Then Exit For blank4 = Mid$(str_tmp, 11, 4) T(I + 1) = Val(Mid$(str_tmp, 15, 6)) If I + 2 > NUMNP Then Exit For blank4 = Mid$(str_tmp, 21, 4) T(I + 2) = Val(Mid$(str_tmp, 25, 6)) If I + 3 > NUMNP Then Exit For blank4 = Mid$(str_tmp, 31, 4) T(I + 3) = Val(Mid$(str_tmp, 35, 6)) If I + 4 > NUMNP Then Exit For blank4 = Mid$(str_tmp, 41, 4) T(I + 4) = Val(Mid$(str_tmp, 45, 6)) If I + 5 > NUMNP Then Exit For blank4 = Mid$(str_tmp, 51, 4) T(I + 5) = Val(Mid$(str_tmp, 55, 6)) If I + 6 > NUMNP Then Exit For blank4 = Mid$(str_tmp, 61, 4) T(I + 6) = Val(Mid$(str_tmp, 65, 6)) Next I GoTo lab30 lab10: For I = 1 To NUMNP T(I) = TEMP 'Uniform initial temperature at node I Next I ' ' OUTPUT INITIAL TEMPERATURES ' lab30: Dim NCON As Integer Call PROUT(4, T(), AT(), LM(), T1(), B(), MAIN, NCON, 1) GoTo lab50 ' lab40: ' ' TERMINATE PROGRAM - INITIAL TIME STEP CARD ERROR ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " - - - - PROGRAM TERMINATED - ERROR IN INITIAL TIME STEP CARD - - - -" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " "; IA, MDT, TIME, TEMP, " "; JP Close #NIN Close #NOUT End '<<<<<<<<< ' lab50: ' ' READ TIME STEP CARD ' WHERE IA - CONTROL WORD (STEP) ' NDT - SEQUENCE NUMBER ' DT - TIME STEP INTERVAL ' ITOF - NUMBER OF NON-ZERO TEMPERATURE OR FLOW B.C. ' TFIRE(I) - TEMPERATURE OF FIRE FOR CURRENT TIME STEP ' I CAN VARY FROM 1 TO 4 ' I1 - PRINTED OUTPUT OPTION ' 0 - NO PRINTED OUTPUT ' 1 - OUTPUT NODAL POINT TEMPERATURES ' 2 - OUTPUT ELEMENT TEMPERATURES ' 3 - OUTPUT BOTH NODAL AND ELEMENT TEMPERATURES ' I2 - PUNCHED OUTPUT OPTION ' CODE SAME AS FOR PRINTED DATA ' I6 - DEBUGGING OUTPUT OPTION ' I7 - CHANGE OF FIRE SURFACE ELEMENTS OPTION ' lab60: 'Dim IA As String * 4 Dim NDT As Integer Dim DT As Double Dim ITOF As Integer 'Dim TFIRE(4) As Double Dim I1 As Integer Dim I2 As Integer Dim I6 As Integer Dim I7 As Integer '----------------------------------------------------- ' Time Step Control Card (A4,I6,F10.0,I5,4F10.0,4I3) '----------------------------------------------------- Line Input #NIN, str_tmp IA = Mid$(str_tmp, 1, 4) 'Enter the word "STEP" NDT = Val(Mid$(str_tmp, 5, 6)) 'Time step number DT = Val(Mid$(str_tmp, 11, 10)) 'Time step interval ITOF = Val(Mid$(str_tmp, 21, 5)) 'Number of non-zero flow or 'temperature boundary conditions TFIRE(1) = Val(Mid$(str_tmp, 26, 10)) 'Temperature of fire 1 TFIRE(2) = Val(Mid$(str_tmp, 36, 10)) 'Temperature of fire 2 TFIRE(3) = Val(Mid$(str_tmp, 46, 10)) 'Temperature of fire 3 TFIRE(4) = Val(Mid$(str_tmp, 56, 10)) 'Temperature of fire 4 I1 = Val(Mid$(str_tmp, 66, 3)) 'Printed output desired for this time step 'If I1=0, no output 'If I1=1, nodal temperatures 'If I1=2, element temperatures 'If I1=3, both nodal and element temperatures I2 = Val(Mid$(str_tmp, 69, 3)) 'Punched output desired for this time step 'If I2=0, no punched output 'If I2=1, nodal temperatures 'If I2=2, element temperatures 'If I2=3, both nodal and element temperatures I6 = Val(Mid$(str_tmp, 72, 3)) 'Intermediate printed output for debugging purposes 'If I6=0, no printout 'If I6=1, debugging printout I7 = Val(Mid$(str_tmp, 75, 3)) 'Fire boundary condition flag 'If I7=0, continue with same fire B.C. 'surfaces previously defined 'If i7=1, input new fire B.C. surface in 'Data Block below MAIN = 0 MDT = MDT + 1 ' ' CHECK SEQUENCING OF TIME STEP CARD ' If NDT = MDT And IA = "STEP" Then GoTo lab90 ' ' PROGRAM TERMINATED IF SEQUENCING ERROR ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " TIME STEP CARD OUT OF SEQUENCE - CARD NO."; 0 'valore arbitrario indefinito Print #NOUT, "" Print #NOUT, " INPUT CARD" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " - - - - PROGRAM TERMINATED - TIME STEP CARD WAS - - - -" lab70: Print #NOUT, "" Print #NOUT, "" Print #NOUT, " "; IA, NDT, DT, ITOF, TFIRE(1), TFIRE(2), TFIRE(3), TFIRE(4), I1, I2, I6, I7 Close #NIN Close #NOUT End '<<<<<<<<
lab80: Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " NO TIME INTERVAL ESTABLISHED" GoTo lab70 ' ' ESTABLISH TIME INTERVAL DT ' lab90: Select Case (DT) Case Is < 0# GoTo lab100 Case Is = 0# GoTo lab110 Case Is > 0# GoTo lab120 End Select
lab100: Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " PROBLEM COMPLETED" Exit Sub ' lab110: If DS = 0# Then GoTo lab80 DT = DS GoTo lab130 lab120: DS = DT lab130:
' TIME = TIME + DT ' ' OUTPUT HEADING FOR TIME STEP ' Print #NOUT, "6" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, " FIRES-T3 - FIRE RESPONSE OF STRUCTURES - THERMAL" Print #NOUT, "" Print #NOUT, " "; ITITLE Print #NOUT, "" Print #NOUT, " TIME STEP NUMBER "; NDT; " - TIME "; TIME; " - TIME STEP "; DT Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, " NUMBER OF NON-ZERO FLOW OR TEMPERATURE CONDITIONS"; ITOF If NUMFBC = 0 Then GoTo lab140 Print #NOUT, "" Print #NOUT, " FIRE BOUNDARY CONDITION" For I = 1 To 4 Print #NOUT, "" Print #NOUT, " FIRE("; I; ") = "; TFIRE(I); Next I Print #NOUT, "" lab140: Dim DT2 As Double DT2 = 1# / DT ' ' ' B E G I N N I N G O F S Y S T E M I T E R A T I O N ' ' lab150: MAIN = MAIN + 1 ' ' SAVE THE INITIALLY ASSUMED TEMPERATURES IN VECTOR T1 ' Dim N As Integer For N = 1 To NUMNP T1(N) = T(N) Next N If I6 <> 0 Then Call PROUT(1, T(), AT(), LM(), T1(), B(), MAIN, NCON, I1) ' ' FORM CONDUCTIVITY MATRIX AND STORE IN MATRIX A, AND ALSO FORM ' THE HEAT CAPACITY MATRIX AND STORE IN VECTOR Q ' Call HCONDC(AT(), A(), NUMNP, MATL(), XYS(), T(), Q(), LM(), MMTYPE(), BAREA(), THICK(), X(), Y(), Z(), VOLUME()) ' ' INITIALIZE HEAT LOAD VECTOR TO 0.0 - VECTOR B ' For I = 1 To NUMNP B(I) = 0# Next I ' ' ADD INTERNAL HEAT GENERATION TO VECTOR B ' If NINT = 0 Then GoTo lab180 Call QEXO(LM(), IEL(), IMAT(), IEXO(), EXYS(), AT(), MATL(), VEL(), MMTYPE(), B(), XYS(), TIME) ' ' INPUT ANY NON-ZERO TEMPERATURE AND FLOW BOUNDARY CONDITONS ' AND ADD THE RELATED TERMS TO MATRIX A AND VECTOR B ' lab180: Call HATEMP(ITOF, D(), KODE(), B(), A(), NUMNP, MAIN, T3(), Q()) ' ' ADD CAPACITY TERMS TO CONDUCTIVITY MATRIX A ' For N = 1 To NUMNP 'If KODE(N) = "TEMP" Then GoTo lab200 If KODE(N) = TEMP Then GoTo lab200 Select Case (Q(N)) Case Is < 0# GoTo lab190 Case Is = 0# GoTo lab200 Case Is > 0# GoTo lab190 End Select lab190: A(N, 1) = A(N, 1) + Q(N) * DT2 lab200: Next N ' ' TRIANGULARIZE THE MODIFIED CONDUCTIVITY MATRIX ' Call MSYM(1, B(), MA(), A(), NUMNP) ' If MAIN <> 1 Then GoTo lab220 ' ' CALCULATE EFFECTIVE LOAD VECTOR B ' ' CALCULATE CAPACITY MATRIX CONTRIBUTION TO THE EFFECTIVE LOAD ' AND SAVE IN VECTOR T2 ' Dim II As Integer For II = 1 To NUMNP 'If KODE(II) = "TEMP" Then GoTo lab210 If KODE(II) = TEMP Then GoTo lab210 T2(II) = Q(II) * T(II) * DT2 lab210: Next II lab220: For II = 1 To NUMNP 'If KODE(II) = "TEMP" Then GoTo lab230 If KODE(II) = TEMP Then GoTo lab230 B(II) = B(II) + T2(II) lab230: Q(II) = B(II) Next II NCON = 0 If NUMFBC = 0 Then GoTo lab260 ' ' IF FIRE BOUNDARY CONDITION SURFACE CONFIGURATION IS TO BE CHANGED ' ON THIS TIME STEP, INPUT THE NEW DATA ' If I7 = 0 Then GoTo lab250 Call FIREBC(X(), Y(), Z(), KODE(), BAREA(), THICK(), LI(), LJ(), LK(), LL(), LMAT(), LFIRE(), AIJKL(), LELEM()) ' ' ' B E G I N N I N G O F F I R E B. C. I T E R A T I O N ' ' lab240: ' ' CALCULATE THE HEAT FLOW RELATED TO THE FIRE B.C. ' lab250: Call FIRE(LI(), LJ(), LK(), LL(), LMAT(), LFIRE(), AIJKL(), MAT(), FXYS(), T(), TFIRE(), B()) NCON = NCON + 1 ' ' CALCULATE THE TEMPERATURES THROUGH BACK SUBSTITUTION ' lab260: Call MSYM(2, B(), MA(), A(), NUMNP) ' If NUMFBC = 0 Then GoTo lab280 If NCONV = 0 Then GoTo lab280 If I6 <> 0 Then Call PROUT(2, T(), AT(), LM(), T1(), B(), MAIN, NCON, I1) ' ' CHECK FOR CONVERGENCE OF FIRE B.C. CYCLE AGAINST PERMISSIBLE ERROR ' Dim DX As Double Dim DY As Double For N = 1 To NUMNP DX = Abs(B(N) - T(N)) DY = CONV * Abs(B(N) + T(N)) If DX > DY Then GoTo lab300 Next N lab280: For N = 1 To NUMNP T(N) = B(N) Next N GoTo lab320 ' ' IF CONVERGENCE NOT OBTAINED CHECK FOR POSSIBILITY OF EXCEEDING ' PERMISSIBLE NUMBER OF CYCLES FOR FIRE B.C. ' lab300: If NCON > NCONV Then Call PROUT(3, T(), AT(), LM(), T1(), B(), MAIN, NCON, I1) ' ' ESTIMATE NEW APPROXIMATION OF TEMPERATURES FOR FIRE B.C. ' Dim JJ As Integer For JJ = 1 To NUMNP DX = B(JJ) - T(JJ) T(JJ) = B(JJ) + BETA * DX B(JJ) = Q(JJ) Next JJ GoTo lab240 ' lab320: If NCONU = 0 Then GoTo lab360 ' ' CHECK CONVERGENCE OF SYSTEM CYCLE AGAINST PERMISSIBLE ERROR ' For N = 1 To NUMNP DX = Abs(T(N) - T1(N)) DY = CONU * Abs(T(N) + T1(N)) If DX > DY Then GoTo lab340 Next N GoTo lab360 ' ' CHECK TO SEE IF NUMBER OF SYSTEM ITERATIONS HAS EXCEEDED ' PERMISSIBLE NUMBER OF ITERATIONS ' lab340: If MAIN > NCONU Then Call PROUT(3, T(), AT(), LM(), T1(), B(), MAIN, NCON, I1) ' ' ESTIMATE NEW APPROXIMATION OF SYSTEMS TEMPERATURES ' For N = 1 To NUMNP DX = T(N) - T1(N) T(N) = T(N) + ALPHA * DX Next N GoTo lab150 lab360: ' ' CHECK FOR DESIRED OUTPUT ' If I1 <> 0 Then Call PROUT(4, T(), AT(), LM(), T1(), B(), MAIN, NCON, I1) If I2 <> 0 Then Call PUOUT(I1, I2, T(), AT(), X(), Y(), Z(), TIME, IP1, IP2, LM(), JP) Dim NC As Integer Dim NS As Integer NC = NCON - 1 NS = MAIN - 1 Print #NOUT, "" Print #NOUT, "" Print #NOUT, NS; " SYSTEM ITERATIONS WERE PERFORMED" Print #NOUT, NC; " B. C. ITERATIONS WERE PERFORMED" GoTo lab60 ' ' ' End Sub
Private Sub HCONDC(AT() As Double, A() As Double, NUMNP As Integer, MATL() As Integer, XYS() As Tipo_XYS, _ T() As Double, Q() As Double, LM() As Integer, MMTYPE() As Integer, BAREA() As Double, THICK() As Double, _ X() As Double, Y() As Double, Z() As Double, VOLUME() As Double) ' ' ' SUBROUTINE *HCONDC* FORMS CONDUCTIVITY AND HEAT CAPACITY MATRICES ' ' 'DIMENSION AT(1), A(NP,1), MATL(1), XYS(1), T(1), Q(1), 'S(8,8), LM(1), PSTU(8), B(3,8), MMTYPE(1), BAREA(1), THICK(1), 'X(1), Y(1), Z(1), POS(2), SI(4), TI(4), XX(4), YY(4), DPSTU(2,4), CJAC(3,3), VOLUME (1)
'DATA POS/-0.57735027,+0.57735027/ 'DATA SI/-1.,1.,1.,-1./ 'DATA TI/-1.,-1.,1.,1./
'Gaussian integration '------------------------------------------------------------ 'Number of points (n) Location (ri) Weight (wi) ' 2 +/-0.577350269189626 1.0 '------------------------------------------------------------ Dim POS(2) As Double POS(1) = -0.577350269189626 POS(2) = 0.577350269189626 Dim SI(4) As Double SI(1) = -1# SI(2) = 1# SI(3) = 1# SI(4) = -1# Dim TI(4) As Double TI(1) = -1# TI(2) = -1# TI(3) = 1# TI(4) = 1#
'ReDim A(NUMNP, 1) As Double '-----------????? Dim S(8, 8) As Double Dim PSTU(8) As Double Dim B(3, 8) As Double Dim XX(4) As Double Dim YY(4) As Double Dim DPSTU(2, 4) As Double Dim CJAC(3, 3) As Double
' ' ' INITIALIZE THE SYSTEMS CONDUCTIVITY MATRIX TO 0.0 ' AND THE SYSTEMS HEAT CAPACITY MATRIX TO 0.0 ' Dim I As Integer Dim J As Integer 'ReDim Q(NUMNP) As Double '---------tex For I = 1 To NUMNP Q(I) = 0# Next I 'Dim MB As Integer 'MB = MBAND * NUMNP 'For I = 1 To MB ' A(I) = 0# 'Next I 'ReDim A(NUMNP, MBAND) As Double '---------tex For I = 1 To NUMNP '---------tex For J = 1 To MBAND '---------tex A(I, J) = 0# '---------tex Next J '---------tex Next I '---------tex
' ' ' O N E - D I M E N S I O N A L E L E M E N T S ' ' If NEL1D = 0 Then GoTo lab50 Dim NLM As Integer NLM = 0 Dim N As Integer For N = 1 To NEL1D NLM = NLM + 2 For I = 1 To 2 For J = 1 To 2 S(I, J) = 0# Next J Next I Dim II As Integer Dim KK As Integer Dim AA As Double Dim BB As Double Dim CC As Double Dim XL As Double II = LM(NLM - 1) KK = LM(NLM) AA = X(II) - X(KK) BB = Y(II) - Y(KK) CC = Z(II) - Z(KK) XL = Sqr(AA * AA + BB * BB + CC * CC) AT(N) = 0.5 * (T(II) + T(KK)) Dim TEMP As Double Dim MS As Integer Dim K As Integer TEMP = AT(N) MS = MMTYPE(N) MS = (MS - 1) * 6 J = MATL(MS + 1) K = MATL(MS + 2) Dim COND As Double 'COND = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " K(T) ") COND = VMAT(J, K, XYS(), TEMP, " K(T) ") '---------tex J = MATL(MS + 3) K = MATL(MS + 4) Dim SPHT As Double 'SPHT = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " CP(T) ") SPHT = VMAT(J, K, XYS(), TEMP, " CP(T) ") '---------tex J = MATL(MS + 5) K = MATL(MS + 6) Dim DENS As Double 'DENS = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " D(T) ") DENS = VMAT(J, K, XYS(), TEMP, " D(T) ") '---------tex S(1, 1) = BAREA(N) * COND / XL S(1, 2) = -S(1, 1) S(2, 1) = S(1, 2) S(2, 2) = S(1, 1) Dim QSTORE As Double QSTORE = SPHT * DENS * XL * BAREA(N) / 2# ' ' ADD ELEMENT CONDUCTIVITY AND CAPACITY TO SYSTEM MATRICES ' Q(II) = Q(II) + QSTORE Q(KK) = Q(KK) + QSTORE A(II, 1) = A(II, 1) + S(1, 1) Dim JJ As Integer JJ = KK - II + 1 If JJ > 0 Then A(II, JJ) = A(II, JJ) + S(1, 2) JJ = II - KK + 1 If JJ > 0 Then A(KK, JJ) = A(KK, JJ) + S(1, 2) A(KK, 1) = A(KK, 1) + S(2, 2) Next N ' ' ' T W O - D I M E N S I O N A L E L E M E N T S ' ' lab50: If NEL2D = 0 Then GoTo lab270 NLM = 2 * NEL1D Dim N1 As Integer Dim LL1 As Integer Dim LL2 As Integer Dim LL3 As Integer Dim LL4 As Integer For N = 1 To NEL2D N1 = N + NEL1D NLM = NLM + 4 For I = 1 To 4 For J = 1 To 4 S(I, J) = 0# Next J Next I LL1 = LM(NLM - 3) LL2 = LM(NLM - 2) LL3 = LM(NLM - 1) LL4 = LM(NLM) AT(N1) = 0.25 * (T(LL1) + T(LL2) + T(LL3) + T(LL4)) ' ' TEST FOR ORIENTATION OF 2-D ELEMENT - X-Y, X-Z, OR Y-Z PLANE ' Dim J0 As Integer Dim ZZZ As Double Dim DZ As Double J0 = LM(NLM - 3) ZZZ = Z(J0) For I = 1 To 3 J = LM(NLM - 3 + I) DZ = Abs(ZZZ - Z(J)) If DZ > 0.00001 Then GoTo lab90 Next I For I = 1 To 4 J = LM(NLM - 4 + I) XX(I) = X(J) YY(I) = Y(J) Next I GoTo lab160 lab90: Dim YYY As Double Dim DY As Double YYY = Y(J0) For I = 1 To 3 J = LM(NLM - 3 + I) DY = Abs(YYY - Y(J)) If DY > 0.00001 Then GoTo lab120 Next I For I = 1 To 4 J = LM(NLM - 4 + I) XX(I) = X(J) YY(I) = Z(J) Next I GoTo lab160 lab120: Dim XXX As Double Dim DX As Double XXX = X(J0) For I = 1 To 3 J = LM(NLM - 3 + I) DX = Abs(XXX - X(J)) If DX > 0.00001 Then GoTo lab150 Next I For I = 1 To 4 J = LM(NLM - 4 + I) XX(I) = Y(J) YY(I) = Z(J) Next I GoTo lab160 lab150: Print #NOUT, "" Print #NOUT, "" Print #NOUT, " STOP-ERROR IN 2-D ELEMENT NO. "; N Print #NOUT, "" Print #NOUT, " NOT IN X-Y, X-Z, OR Y-Z PLANE" Close #NIN Close #NOUT End '<<<<<<< lab160: Dim VOL As Double VOL = 0# Dim III As Integer Dim JJJ As Integer Dim SE As Double Dim TE As Double For III = 1 To 2 For JJJ = 1 To 2 SE = POS(III) TE = POS(JJJ) For I = 1 To 4 PSTU(I) = (1# + SE * SI(I)) * (1# + TE * TI(I)) / 4# DPSTU(1, I) = SI(I) * (1# + TE * TI(I)) / 4# DPSTU(2, I) = TI(I) * (1# + SE * SI(I)) / 4# Next I For I = 1 To 2 CJAC(I, 1) = 0# CJAC(I, 2) = 0# For J = 1 To 4 CJAC(I, 1) = CJAC(I, 1) + DPSTU(I, J) * XX(J) CJAC(I, 2) = CJAC(I, 2) + DPSTU(I, J) * YY(J) Next J Next I Dim DETJ As Double Call INVMAT(CJAC(), DETJ, 2) VOL = VOL + DETJ * THICK(N) For I = 1 To 2 For J = 1 To 4 B(I, J) = 0# For K = 1 To 2 B(I, J) = B(I, J) + CJAC(I, K) * DPSTU(K, J) Next K Next J Next I Dim ATT As Double ATT = 0# Dim L As Integer For I = 1 To 4 L = LM(NLM - 4 + I) ATT = ATT + PSTU(I) * T(L) Next I TEMP = ATT MS = MMTYPE(N1) MS = (MS - 1) * 6 J = MATL(MS + 1) K = MATL(MS + 2) 'COND = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " K(T) ") COND = VMAT(J, K, XYS(), TEMP, " K(T) ") '---------tex J = MATL(MS + 3) K = MATL(MS + 4) 'SPHT = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " CP(T) ") SPHT = VMAT(J, K, XYS(), TEMP, " CP(T) ") '---------tex J = MATL(MS + 5) K = MATL(MS + 6) 'DENS = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " D(T) ") DENS = VMAT(J, K, XYS(), TEMP, " D(T) ") '---------tex Dim DETCON As Double DETCON = DETJ * COND * THICK(N) For I = 1 To 4 For J = 1 To 4 For K = 1 To 2 S(I, J) = S(I, J) + DETCON * B(K, I) * B(K, J) Next K Next J Next I Next JJJ Next III QSTORE = DENS * SPHT * VOL / 4# ' ' ADD ELEMENT CAPACITY MATRIX TO SYSTEM CAPACITY MATRIX ' For L = 1 To 4 I = LM(NLM - 4 + L) Q(I) = Q(I) + QSTORE Next L ' ' ADD ELEMENT CONDUCTIVITY TO SYSTEM CONDUCTIVITY MATRIX ' Dim M As Integer For L = 1 To 4 I = LM(NLM - 4 + L) For M = 1 To 4 J = LM(NLM - 4 + M) - I + 1 Select Case (J) Case Is < 0 GoTo lab250 Case Is = 0 GoTo lab250 Case Is > 0 GoTo lab240 End Select lab240: A(I, J) = A(I, J) + S(L, M) lab250: Next M Next L Next N lab260: ' ' ' T H R E E - D I M E N S I O N A L E L E M E N T S ' ' lab270: If NEL3D = 0 Then GoTo lab360 'REWIND 6 Dim TAPE6 As Integer TAPE6 = FreeFile Open percorso + nomefile + ".TAPE6" For Input As TAPE6 NLM = 2 * NEL1D + 4 * NEL2D For N = 1 To NEL3D N1 = N + NEL1D + NEL2D NLM = NLM + 8 For I = 1 To 8 For J = 1 To 8 S(I, J) = 0# Next J Next I Dim LL5 As Integer Dim LL6 As Integer Dim LL7 As Integer Dim LL8 As Integer LL1 = LM(NLM - 7) LL2 = LM(NLM - 6) LL3 = LM(NLM - 5) LL4 = LM(NLM - 4) LL5 = LM(NLM - 3) LL6 = LM(NLM - 2) LL7 = LM(NLM - 1) LL8 = LM(NLM) AT(N1) = 0.125 * (T(LL1) + T(LL2) + T(LL3) + T(LL4) + T(LL5) + T(LL6) + T(LL7) + T(LL8)) Dim KKK As Integer For III = 1 To 2 For JJJ = 1 To 2 For KKK = 1 To 2 Input #TAPE6, DETJ For I = 1 To 8 Input #TAPE6, PSTU(I) Next I For J = 1 To 8 For I = 1 To 3 Input #TAPE6, B(I, J) Next I Next J
ATT = 0# For I = 1 To 8 L = LM(NLM - 8 + I) ATT = ATT + PSTU(I) * T(L) Next I TEMP = ATT MS = MMTYPE(N1) MS = (MS - 1) * 6 J = MATL(MS + 1) K = MATL(MS + 2) 'COND = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " K(T) ") COND = VMAT(J, K, XYS(), TEMP, " K(T) ") '---------tex J = MATL(MS + 3) K = MATL(MS + 4) 'SPHT = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " CP(T) ") SPHT = VMAT(J, K, XYS(), TEMP, " CP(T) ") '---------tex J = MATL(MS + 5) K = MATL(MS + 6) 'DENS = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " D(T) ") DENS = VMAT(J, K, XYS(), TEMP, " D(T) ") '---------tex DETCON = DETJ * COND For I = 1 To 8 For J = 1 To 8 For K = 1 To 3 S(I, J) = S(I, J) + DETCON * B(K, I) * B(K, J) Next K Next J Next I Next KKK Next JJJ Next III VOL = VOLUME(N) QSTORE = DENS * SPHT * VOL / 8# ' ' ADD ELEMENT CAPACITY MATRIX TO SYSTEM CAPACITY MATRIX ' For L = 1 To 8 I = LM(NLM - 8 + L) Q(I) = Q(I) + QSTORE Next L ' ' ADD ELEMENT CONDUCTIVITY TO THE SYSTEMS CONDUCTIVITY MATRIX - A ' For L = 1 To 8 I = LM(NLM - 8 + L) For M = 1 To 8 J = LM(NLM - 8 + M) - I + 1 Select Case (J) Case Is < 0 GoTo lab340 Case Is = 0 GoTo lab340 Case Is > 0 GoTo lab330 End Select lab330: A(I, J) = A(I, J) + S(L, M) lab340: Next M Next L Next N Close #TAPE6 ' lab360: ' ' End Sub
Private Sub HATEMP(ITOF As Integer, D() As Double, KODE() As Tipo_KODE, B() As Double, A() As Double, _ NUMNP As Integer, MAIN As Integer, T3() As Double, Q() As Double) ' ' ' SUBROUTINE *HATEMP* APPLIES THE FIXED TEMPERATURE OR FLOW ' BOUNDARY CONDITIONS ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D,_ 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'DIMENSION D(1), KODE(1), B(1), A(NUMNP, 1), T3(1), Q(1) 'ReDim A(NUMNP, 1) As Double '-----------????? If MAIN <> 1 Then GoTo lab30 ' ' INITIALIZE TEMPERATURE AND FLOW B.C. TO 0.0 ' Dim I As Integer For I = 1 To NUMNP D(I) = 0# Next I ' If ITOF = 0 Then GoTo lab30 ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, " HVALUES OF TEMPERATURES OR FLOWS" Print #NOUT, "" Print #NOUT, " FOR NON-ZERO BOUNDARY CONDITIONS" ' ' INPUT NON-ZERO TEMPERATURE AND FLOW B.C. ' '----------------------------------------------------- ' Nonzero Boundary Condition Data (5(I5,F10.0)) '----------------------------------------------------- For I = 1 To ITOF Step 5 Line Input #NIN, str_tmp If I > ITOF Then Exit For Q(I) = Val(Mid$(str_tmp, 1, 5)) 'Node number T3(I) = Val(Mid$(str_tmp, 6, 10)) 'Specified temperature or flow at that node If I + 1 > ITOF Then Exit For Q(I + 1) = Val(Mid$(str_tmp, 16, 5)) T3(I + 1) = Val(Mid$(str_tmp, 21, 10)) If I + 2 > ITOF Then Exit For Q(I + 2) = Val(Mid$(str_tmp, 31, 5)) T3(I + 2) = Val(Mid$(str_tmp, 36, 10)) If I + 3 > ITOF Then Exit For Q(I + 3) = Val(Mid$(str_tmp, 46, 5)) T3(I + 3) = Val(Mid$(str_tmp, 51, 10)) If I + 4 > ITOF Then Exit For Q(I + 4) = Val(Mid$(str_tmp, 61, 5)) T3(I + 4) = Val(Mid$(str_tmp, 66, 10)) Next I
Print #NOUT, "" Print #NOUT, "" Print #NOUT, " NODE TYPE VALUE" ' ' OUTPUT THE NON-ZERO BOUNDARY CONDITIONS AND STORE IN MATRIX D ' Dim II As Integer Dim JJ As Tipo_KODE For I = 1 To ITOF II = Q(I) D(II) = T3(I) JJ = KODE(II) Print #NOUT, II; " "; JJ; " "; D(II) Next I ' lab30: Dim N As Integer For N = 1 To NUMNP ' ' MODIFY MATRIX B FOR FLOW B.C. ' B(N) = B(N) + D(N) 'If KODE(N) = "FLOW" Then GoTo lab90 If KODE(N) = FLOW Then GoTo lab90 ' ' MODIFY A AND B MATRIX FOR TEMPERATURE B.C. ' Dim M As Integer Dim K As Integer For M = 2 To MBAND K = N - M + 1 Select Case (K) Case Is < 0 GoTo lab50 Case Is = 0 GoTo lab50 Case Is > 0 GoTo lab40 End Select lab40: B(K) = B(K) - A(K, M) * D(N) A(K, M) = 0# lab50: Dim L As Integer L = N + M - 1 Select Case (NUMNP - L) Case Is < 0 GoTo lab70 Case Is = 0 GoTo lab60 Case Is > 0 GoTo lab60 End Select lab60: B(L) = B(L) - A(N, M) * D(N) lab70: A(N, M) = 0# Next M
A(N, 1) = 1# B(N) = D(N) lab90: Next N ' ' ' End Sub
Notare che il salto condizionale seguente non è standard nel Fortran77 pertanto ipotizzo che se KKK=1 salta alla etichetta 10 se KKK=2 salta alla etichetta 70.
quindi:
CODICE Select Case KKK Case 1 GoTo lab10 Case 2 GoTo lab70 End Select
traduco la sub MYSIM
CODICE Private Sub MSYM(KKK As Integer, B() As Double, MA() As Integer, A() As Double, NUMNP As Integer) ' ' ' SUBROUTINE *MSYM* IS AN EQUATION SOLVER ' BASED ON A MODIFIED SYMSOL - VARIABLE BANDWIDTH WITH ZEROS IN BAND ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D,NEL2D, 'NEL3D,NUMEL,MBAND,NMAT,NFBC1D,NFBC2D,NFBC3D,NBCMAT,NBCTYP 'DIMENSION B(1), MA(1), A(NP, 1) ' 'ReDim A(NP, 1) As Double '-----------????? Dim NEQ As Integer NEQ = NUMNP ' Select Case KKK Case 1 GoTo lab10 Case 2 GoTo lab70 End Select ' ' **************************************************************** ' ' REDUCE MATRIX..... A ' ' **************************************************************** ' lab10: Dim NEQQ As Integer Dim N As Integer Dim M As Integer Dim I As Integer Dim L As Integer Dim CC As Double Dim J As Integer Dim K As Integer NEQQ = NEQ - 1 For N = 1 To NEQQ ' M = MBAND For I = 2 To MBAND If A(N, M) <> 0# Then GoTo lab30 M = M - 1 Next I lab30: MA(N) = M ' I = N For L = 2 To M I = I + 1 CC = A(N, L) / A(N, 1) If CC = 0# Then GoTo lab50 J = 0 For K = L To M J = J + 1 A(I, J) = A(I, J) - CC * A(N, K) Next K A(N, L) = CC lab50: Next L Next N GoTo lab120 ' ' **************************************************************** ' ' REDUCE VECTOR..... B AND BACKSUBSTITUTE ' ' **************************************************************** ' lab70: For N = 1 To NEQQ CC = B(N) If CC = 0# Then GoTo lab90 M = MA(N) I = N For L = 2 To M I = I + 1 B(I) = B(I) - CC * A(N, L) Next L B(N) = CC / A(N, 1) lab90: Next N B(NEQ) = B(NEQ) / A(NEQ, 1) ' Dim NN As Integer NN = NEQ For N = 1 To NEQQ NN = NN - 1 M = MA(NN) I = NN For K = 2 To M I = I + 1 B(NN) = B(NN) - A(NN, K) * B(I) Next K Next N lab120: End Sub
stesso discorso di prima ma più esteso
CODICE GO TO (10,20,30,40), K diviene:
CODICE Select Case K Case 1 GoTo lab10 Case 2 GoTo lab20 Case 3 GoTo lab30 Case 4 GoTo lab40 End Select pertanto:
CODICE Private Sub PROUT(K As Integer, T() As Double, AT() As Double, LM() As Integer, T1() As Double, B() As Double, _ MAIN As Integer, NCON As Integer, I1 As Integer) ' ' ' SUBROUTINE *PROUT* PRINTS TEMPERATURE DISTRIBUTIONS ' ( BOTH NODAL AND ELEMENT ) ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'DIMENSION T(1), AT(1), T1(1), B(1), LM(1) ' ' Select Case K Case 1 GoTo lab10 Case 2 GoTo lab20 Case 3 GoTo lab30 Case 4 GoTo lab40 End Select ' lab10: ' ' DEBUGGING OUTPUT FOR TEMPERATURES AT BEGINNING OF SYSTEM CYCLE ' Print #NOUT, "" Print #NOUT, " NODAL POINT TEMPERATURES AT BEGINNING OF SYSTEM CYCLE NUMBER"; MAIN Dim N As Integer For N = 1 To NUMNP Print #NOUT, N, T(N), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" Exit Sub ' lab20: ' ' DEBUGGING OUTPUT TEMPERATURES FOR FIRE B.C. CYCLE ' Print #NOUT, "" Print #NOUT, " NODAL POINT TEMPERATURE FOR B.C. CYCLE"; NCON For N = 1 To NUMNP Print #NOUT, N, B(N), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" Exit Sub ' lab30: ' ' OUTPUT DATA FOR DUMP WHEN PROBLEM HAS NOT CONVERGED AFTER ' PERMISSIBLE NUMBER OF CYCLES ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, " PROGRAM TERMINATED" Print #NOUT, "" Print #NOUT, " CONVERGENCE NOT OBTAINED IN REQUIRED NUMBER OF ITERATIONS" Print #NOUT, "" Print #NOUT, " SYSTEM CYCLE "; MAIN; " AND B.C. CYCLE "; NCON Print #NOUT, "" Print #NOUT, "" Print #NOUT, " SYSTEM NODAL POINT TEMPERATURES" For N = 1 To NUMNP Print #NOUT, N, T1(N), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " NODAL POINT TEMPERATURES AT BEGINNING OF B.C. CYCLE" For N = 1 To NUMNP Print #NOUT, N, T(N), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " NODAL POINT TEMPERATURES AT END OF B.C. CYCLE" For N = 1 To NUMNP Print #NOUT, N, B(N), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" Close #NIN Close #NOUT End '<<<<<<<< ' lab40: ' ' OUTPUT OF RESULTS FOR A TIME STEP ' Select Case (I1 = 1 Or I1 = 3) Case True GoTo lab50 Case False GoTo lab60 End Select lab50: ' ' OUTPUT NODAL POINT TEMPERTURES ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, " ------------ NODAL POINT TEMPERATURES ---------------" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " N TEMP. N TEMP. N TEMP. N TEMP. " For N = 1 To NUMNP Print #NOUT, N, T(N), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" lab60: Select Case (I1 = 2 Or I1 = 3) Case True GoTo lab70 Case False GoTo lab130 End Select
' ' OUTPUT ELEMENT TEMPERATURES ' ' ONE-DIMENSIONAL ELEMENTS ' lab70: If NEL1D = 0 Then GoTo lab90 Dim NLM As Integer NLM = 0 Print #NOUT, "" Print #NOUT, "" Print #NOUT, " -------------- TEMPERATURE OF 1-D ELEMENTS -------------" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " N TEMP. N TEMP. N TEMP. N TEMP. " Dim LL1 As Integer Dim LL2 As Integer For N = 1 To NEL1D NLM = NLM + 2 LL1 = LM(NLM - 1) LL2 = LM(NLM) AT(N) = 0.5 * (T(LL1) + T(LL2)) Next N For N = 1 To NEL1D Print #NOUT, N, AT(N), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" ' ' TWO-DIMENSIONAL ELEMENTS ' lab90: If NEL2D = 0 Then GoTo lab110 NLM = 2 * NEL1D Print #NOUT, "" Print #NOUT, "" Print #NOUT, " -------------- TEMPERATURE OF 2-D ELEMENTS -------------" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " N TEMP. N TEMP. N TEMP. N TEMP. " Dim LL3 As Integer Dim LL4 As Integer For N = 1 To NEL2D NLM = NLM + 4 LL1 = LM(NLM - 3) LL2 = LM(NLM - 2) LL3 = LM(NLM - 1) LL4 = LM(NLM) AT(N + NEL1D) = 0.25 * (T(LL1) + T(LL2) + T(LL3) + T(LL4)) Next N For N = 1 To NEL2D Print #NOUT, N, AT(N + NEL1D), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" ' ' THREE-DIMENSIONAL ELEMENTS ' lab110: If NEL3D = 0 Then GoTo lab130 NLM = 2 * NEL1D + 4 * NEL2D Print #NOUT, "" Print #NOUT, "" Print #NOUT, " -------------- TEMPERATURE OF 3-D ELEMENTS -------------" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " N TEMP. N TEMP. N TEMP. N TEMP. " Dim LL5 As Integer Dim LL6 As Integer Dim LL7 As Integer Dim LL8 As Integer Dim N1 As Integer Dim N2 As Integer For N = 1 To NEL3D NLM = NLM + 8 LL1 = LM(NLM - 7) LL2 = LM(NLM - 6) LL3 = LM(NLM - 5) LL4 = LM(NLM - 4) LL5 = LM(NLM - 3) LL6 = LM(NLM - 2) LL7 = LM(NLM - 1) LL8 = LM(NLM) N1 = N + NEL1D + NEL2D AT(N1) = 0.125 * (T(LL1) + T(LL2) + T(LL3) + T(LL4) + T(LL5) + T(LL6) + T(LL7) + T(LL8)) Next N N2 = NEL1D + NEL2D For N = 1 To NEL3D Print #NOUT, N, AT(N + N2), If N Mod 4 = 0 Then Print #NOUT, "" Next N Print #NOUT, "" ' lab130: ' ' End Sub
Private Sub PUOUT(I1 As Integer, I2 As Integer, T() As Double, AT() As Double, _ X() As Double, Y() As Double, Z() As Double, TIME As Double, _ IP1 As Integer, IP2 As Integer, LM() As Integer, JP As String) ' ' ' SUBROUTINE *PUOUT* PUNCHES THE TEMPERATURE DISTRIBUTIONS THAT ' RESULT FROM THE ANALYSIS DONE IN THE PROGRAM. ' JP - IDENTIFIER TO BE USED IN LAST 8 COLUMNS ' IP1 - COUNTER FOR NODAL DATA CARDS PUNCHED ' IP2 - COUNTER FOR ELEMENT DATA CARDS PUNCHED ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'DIMENSION T(1), AT(1), X(1), Y(1), Z(1), LM(1)
'------------------------------------- 'DISPOSITIVO DI PERFORAZIONE NASTRO 'NON IMPLEMENTABILE HARDWARE OBSOLETO '-------------------------------------
Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . PUNCHING NOT IMPLEMENTED . . ." Print #NOUT, " . . . . OBSOLETE HARDWARE . . . . . ." End Sub
Private Sub FIREMAT(MAT() As Integer, FXYS() As Tipo_XYS, NSTORE As Integer) ' ' ' SUBROUTINE *FIREMAT* INPUTS THE VARIABLES REQUIRED IN THE ' ASSESSMENT OF THE HEAT FLOW ASSOCIATED WITH BOTH LINEAR AND ' NON-LINEAR FIRE BOUNDARY CONDITIONS ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D,NEL3D,NUMEL,MBAND,NMAT,NFBC1D,NFBC2D,NFBC3D,NBCMAT,NBCTYP 'DIMENSION MAT(1), FXYS(1) ' ' OUTPUT PAGE HEADING ' Print #NOUT, "6" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, " FIRES-T3 - FIRE RESPONSE OF STRUCTURES - THERMAL" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " "; ITITLE ' 'If NBCTYP = "LINEAR BC " Then GoTo lab20 If NBCTYP = LINEAR_BC Then GoTo lab20 ' ' NON-LINEAR FIRE BOUNDARY CONDITION ' Print #NOUT, "" Print #NOUT, " NON-LINEAR FIRE BOUNDARY CONDITION" Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " Q=A*(TF-TS)**N+SB*V*(AB*EF*(TF+TSHIFT)**4-ES*(TS+TSHIFT)**4)" Dim SB As Double Dim TSHIFT As Double '----------------------------------------------------- ' Constant Data Card (2E10.0) '----------------------------------------------------- Line Input #NIN, str_tmp SB = Val(Mid$(str_tmp, 1, 10)) 'Stephan - Boltzman constant TSHIFT = Val(Mid$(str_tmp, 11, 10)) 'Shift for absolute temperature
Print #NOUT, "" Print #NOUT, "" Print #NOUT, " WHERE" Print #NOUT, "" Print #NOUT, " TF - PSUEDO FIRE TEMPERATURE" Print #NOUT, " TS - SURFACE TEMPERATURE" Print #NOUT, " SB - STEFAN BOLZTMANN CONSTANT = "; SB Print #NOUT, " TSHIFT - SHIFT TO ABSOLUTE TEMPERATURE SCALE = "; TSHIFT Print #NOUT, "" Print #NOUT, " AND" Print #NOUT, "" Print #NOUT, " MAT CONVECT CONVECT VIEW ABSORBT FIRE SURFACE" Print #NOUT, " NUM FACTOR POWER FACTOR EMISSIV EMISSIV" Print #NOUT, " (A) (N) (V) (AB) (EF) (ES)"
ReDim FXYS(1 To 2) As Tipo_XYS '-------------tex ' FXYS(1).X = SB 'SB - STEFAN BOLZTMANN CONSTANT FXYS(2).X = TSHIFT 'TSHIFT - SHIFT TO ABSOLUTE TEMPERATURE SCALE NSTORE = 3 ' ' INPUT DIFFERENT MATERIAL PROPERTIES FOR FIRE BC ' Dim I As Integer Dim A As Double Dim P As Double Dim V As Double Dim AB As Double Dim EF As Double Dim ES As Double For I = 1 To NBCMAT MAT(I) = NSTORE '----------------------------------------------------- ' Material Data Card (6E10.0) '----------------------------------------------------- Line Input #NIN, str_tmp A = Val(Mid$(str_tmp, 1, 10)) 'Convection factor P = Val(Mid$(str_tmp, 11, 10)) 'Power of convection factor V = Val(Mid$(str_tmp, 21, 10)) 'View factor for radiation term AB = Val(Mid$(str_tmp, 31, 10)) 'Absorption of surface EF = Val(Mid$(str_tmp, 41, 10)) 'Emissivity of flame ES = Val(Mid$(str_tmp, 51, 10)) 'Emissivity of surface
Print #NOUT, I, A, P, V, AB, EF, ES ReDim Preserve FXYS(1 To NSTORE + 5) As Tipo_XYS '-------------tex FXYS(NSTORE).X = A 'CONVECT FACTOR FXYS(NSTORE + 1).X = P 'CONVECT POWER FXYS(NSTORE + 2).X = V 'VIEW FACTOR FXYS(NSTORE + 3).X = AB 'ABSORBT FXYS(NSTORE + 4).X = EF 'FIRE EMISSIV FXYS(NSTORE + 5).X = ES 'SURFACE EMISSIV NSTORE = NSTORE + 6 Next I Exit Sub ' lab20: ' ' LINEAR FIRE BOUNDARY CONDITION ' Print #NOUT, "" Print #NOUT, " LINEAR FIRE BOUNDARY CONDITION" Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " Q = H(T)*(TF-TS)" Print #NOUT, "" Print #NOUT, " WHERE" Print #NOUT, " H(T) - HEAT TRANSFER COEFFICENT" Print #NOUT, " TF - PSUEDO FIRE TEMPERATURE" Print #NOUT, " TS - SURFACE TEMPERATURE" Print #NOUT, " T - AVERAGE TEMPERATUTE (TF+TS)/2" Print #NOUT, "" ' NSTORE = 1 Dim K As Integer Dim MS As Integer For I = 1 To NBCMAT Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . MATERIAL NUMBER "; I; " . . ." Input #NIN, K MS = (I - 1) * 2 MAT(MS + 1) = NSTORE MAT(MS + 2) = K ' If K > 0 Then '------------tex ReDim Preserve FXYS(1 To NSTORE + K - 1) As Tipo_XYS '------------tex Call MATIN(NSTORE, K, FXYS()) '------------tex NSTORE = NSTORE + K '------------tex Else '------------tex ReDim Preserve FXYS(1 To NSTORE) As Tipo_XYS '------------tex Call MATIN(NSTORE, K, FXYS()) '------------tex NSTORE = NSTORE + 1 '------------tex End If '------------tex 'Call MATIN(K, FXYS(NSTORE), FXYS(NSTORE + K), FXYS(NSTORE + K + K)) ' 'NSTORE = NSTORE + 3 * K 'If K = 0 Then NSTORE = NSTORE + 1 Next I lab30: ' End Sub
Private Sub FIREBC(X() As Double, Y() As Double, Z() As Double, KODE() As Tipo_KODE, BAREA() As Double, _ THICK() As Double, LI() As Integer, LJ() As Integer, LK() As Integer, LL() As Integer, _ LMAT() As Integer, LFIRE() As Integer, AIJKL() As Double, LELEM() As Integer) ' ' ' SUBROUTINE *FIREBC* INPUTS THE GEOMETRIC DESCRIPTION OF THE ' SURFACE OF THE SYSTEM THAT WILL BE DIRECTLY EXPOSED TO THE ' FIRE ENVIRONMENT ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'COMMON /SURFACE/ NS1,NS2,NS3 'DIMENSION X(1), Y(1), KODE(1), LI(1), LJ(1), LMAT(1), LFIRE(1), 'Z(1), LK(1), LL(1), AIJKL(1), BAREA(1), THICK(1), LELEM(1) ' ' INPUT CONTROL CARD ' Input #NIN, IREAD 'If Mid$(IREAD, 1, 1) = Chr$(23) Then GoTo lab10 If InStr(IREAD, "SURFACE") > 0 Then GoTo lab10 'HACK <<<<<<< Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " - - - PROGRAM TERMINATED - INPUT ERROR - - -" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " "; IREAD Close #NIN Close #NOUT End '<<<<<<< lab10: Dim N As Integer N = 1 'NS1 = NUMBER(N) 'NS2 = NUMBER(N) 'NS3 = NUMBER(N) Input #NIN, NS1 'HACK <<<<<<< Input #NIN, NS2 'HACK <<<<<<< Input #NIN, NS3 'HACK <<<<<<< ' ' O N E - D I M E N S I O N A L E L E M E N T S ' If NS1 = 0 Then GoTo lab60 Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . THERE ARE"; NS1; " 1-D SURFACE NODES EXPOSED TO FIRE . . ." ' ' INPUT FIRE SURFACE DATA - 4 ELEMENTS PER CARD ' '--------------------------------------------------------- ' Description of One-Dimensional Fire Surface Nodes (16I5) '--------------------------------------------------------- Dim I As Integer For I = 1 To NS1 Step 4 Line Input #NIN, str_tmp If I > NS1 Then Exit For LI(I) = Val(Mid$(str_tmp, 1, 5)) 'Node number of first boundary surface node LMAT(I) = Val(Mid$(str_tmp, 6, 5)) 'Material type for this surface node <=NBCMAT LFIRE(I) = Val(Mid$(str_tmp, 11, 5)) 'Fire number for this surface node LELEM(I) = Val(Mid$(str_tmp, 16, 5)) 'Element number of one-dimensional isoparametric 'bar element adjacent to this surface node If I + 1 > NS1 Then Exit For LI(I + 1) = Val(Mid$(str_tmp, 21, 5)) LMAT(I + 1) = Val(Mid$(str_tmp, 26, 5)) LFIRE(I + 1) = Val(Mid$(str_tmp, 31, 5)) LELEM(I + 1) = Val(Mid$(str_tmp, 36, 5)) If I + 2 > NS1 Then Exit For LI(I + 2) = Val(Mid$(str_tmp, 41, 5)) LMAT(I + 2) = Val(Mid$(str_tmp, 46, 5)) LFIRE(I + 2) = Val(Mid$(str_tmp, 51, 5)) LELEM(I + 2) = Val(Mid$(str_tmp, 56, 5)) If I + 3 > NS1 Then Exit For LI(I + 3) = Val(Mid$(str_tmp, 61, 5)) LMAT(I + 3) = Val(Mid$(str_tmp, 66, 5)) LFIRE(I + 3) = Val(Mid$(str_tmp, 71, 5)) LELEM(I + 3) = Val(Mid$(str_tmp, 76, 5)) Next I ' ' CHECK VALIDITY OF MATERIAL REQUIREMENTS AND PREVIOUSLY DECLARED ' BOUNDARY CONDITIONS. FOR A SURFACE TO BE CONSIDERED A FIRE B.C. ' IT MUST BE BOUNDED BY NODES THAT HAVE A DECLARED FLOW B.C. ' Dim II As Integer For I = 1 To NS1 If LMAT(I) > NBCMAT Then GoTo lab30 II = LI(I) 'If KODE(II) = "TEMP" Then GoTo lab30 If KODE(II) = TEMP Then GoTo lab30 Next I GoTo lab40 lab30: Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " - - - PROGRAM TERMINATED - FIRE BC INPUT ERROR - - - "; _ I, LI(I), LMAT(I), LFIRE(I), LELEM(I) Close #NIN Close #NOUT End '<<<<<<< ' ' CALCULATE AREA OF EACH FIRE B.C. SURFACE ' lab40: For I = 1 To NS1 II = LELEM(I) AIJKL(I) = BAREA(II) Next I ' ' OUTPUT SURFACE ELEMENT DATA ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, "DESCRIPTION OF SURFACE DIRECTLY EXPOSED TO FIRE" Print #NOUT, "" Print #NOUT, " FIREBC NODE MAT FIRE AREA" Print #NOUT, " SURFACE I TYPE TYPE" Print #NOUT, "" For I = 1 To NS1 Print #NOUT, I, LI(I), LMAT(I), LFIRE(I), AIJKL(I) Next I ' ' T W O - D I M E N S I O N A L E L E M E N T S ' lab60: If NS2 = 0 Then GoTo lab120 Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . THERE ARE"; NS2; " 2-D SURFACE ELEMENTS EXPOSED TO FIRE . ." ' ' INPUT SURFACE ELEMENT DATA - THREE ELEMENTS PER CARD ' '------------------------------------------------------------ ' Description of Two-Dimensional Fire Surface Segments (15I5) '------------------------------------------------------------ Dim I1 As Integer Dim I2 As Integer I1 = NFBC1D + 1 I2 = NFBC1D + NS2 For I = I1 To I2 Step 3 Line Input #NIN, str_tmp If I > I2 Then Exit For LI(I) = Val(Mid$(str_tmp, 1, 5)) 'Node number of segment end I for first surface segment LJ(I - NFBC1D) = Val(Mid$(str_tmp, 6, 5)) 'Node number of segment end J for first surface segment LMAT(I) = Val(Mid$(str_tmp, 11, 5)) 'Material type for this surface segment <=NBCMAT LFIRE(I) = Val(Mid$(str_tmp, 16, 5)) 'Fire number for this surface segment LELEM(I) = Val(Mid$(str_tmp, 21, 5)) 'Element number of two-dimensional quadrilateral or 'triangular element adjacent to this surface segment If I + 1 > I2 Then Exit For LI(I + 1) = Val(Mid$(str_tmp, 26, 5)) LJ(I - NFBC1D + 1) = Val(Mid$(str_tmp, 31, 5)) LMAT(I + 1) = Val(Mid$(str_tmp, 36, 5)) LFIRE(I + 1) = Val(Mid$(str_tmp, 41, 5)) LELEM(I + 1) = Val(Mid$(str_tmp, 46, 5)) If I + 2 > I2 Then Exit For LI(I + 2) = Val(Mid$(str_tmp, 51, 5)) LJ(I - NFBC1D + 2) = Val(Mid$(str_tmp, 56, 5)) LMAT(I + 2) = Val(Mid$(str_tmp, 61, 5)) LFIRE(I + 2) = Val(Mid$(str_tmp, 66, 5)) LELEM(I + 2) = Val(Mid$(str_tmp, 71, 5)) Next I ' ' CHECK VALIDITY OF MATERIAL REQUIREMENTS AND PREVIOUSLY DECLARED ' BOUNDARY CONDITIONS. FOR A SURFACE TO BE CONSIDERED A FIRE B.C. ' IT MUST BE BOUNDED BY NODES THAT HAVE A DECLARED FLOW B.C. ' Dim JJ As Integer For I = I1 To I2 If LMAT(I) > NBCMAT Then GoTo lab80 II = LI(I) JJ = LJ(I - NFBC1D) 'If KODE(II) = "TEMP" Or KODE(JJ) = "TEMP" Then GoTo lab80 If KODE(II) = TEMP Or KODE(JJ) = TEMP Then GoTo lab80 Next I GoTo lab90 ' lab80: Dim I0 As Integer I0 = I - NFBC1D Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " - - - PROGRAM TERMINATED - FIRE BC INPUT ERROR - - - "; _ I0, LI(I), LJ(I0), LMAT(I), LFIRE(I), LELEM(I) Close #NIN Close #NOUT End '<<<<<<<< ' ' CALCULATE AREA OF FIRE B.C. SURFACE ELEMENT ' lab90: Dim DX As Double Dim DY As Double Dim DZ As Double Dim D As Double Dim IK As Integer For I = I1 To I2 II = LI(I) JJ = LJ(I - NFBC1D) DX = X(II) - X(JJ) DY = Y(II) - Y(JJ) DZ = Z(II) - Z(JJ) D = DX * DX + DY * DY + DZ * DZ IK = LELEM(I) AIJKL(I) = Sqr(D) * THICK(IK) Next I ' ' OUTPUT SURFACE ELEMENT DATA ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, " DESCRIPTION OF SURFACE DIRECTLY EXPOSED TO FIRE" Print #NOUT, "" Print #NOUT, " FIREBC NODE NODE MAT FIRE AREA" Print #NOUT, " SURFACE I J TYPE TYPE" Print #NOUT, "" For I = 1 To NS2 Print #NOUT, I, LI(I + NFBC1D), LJ(I), LMAT(I + NFBC1D), LFIRE(I + NFBC1D), AIJKL(I + NFBC1D) Next I ' ' REDUCE AREA TO 1/2 FOR FUTURE CALCULATIONS ' For I = I1 To I2 AIJKL(I) = AIJKL(I) / 2# Next I ' ' T H R E E - D I M E N S I O N A L E L E M E N T S ' lab120: If NS3 = 0 Then GoTo lab190 Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . THERE ARE"; NS3; " 3-D SURFACE ELEMENTS EXPOSED TO FIRE . ." ' ' INPUT FIRE B.C. DATA - TWO ELEMENTS PER CARD ' '------------------------------------------------------------ ' Description of Three-Dimensional Fire Surface Areas (12I5) '------------------------------------------------------------ I1 = NFBC1D + NFBC2D + 1 I2 = NFBC1D + NFBC2D + NS3 Dim N1 As Integer N1 = NFBC1D + NFBC2D For I = I1 To I2 Step 2 Line Input #NIN, str_tmp If I > I2 Then Exit For LI(I) = Val(Mid$(str_tmp, 1, 5)) 'Node number of corner I for first surface element LJ(I - NFBC2D) = Val(Mid$(str_tmp, 6, 5)) 'Node number of corner J for first surface element LK(I - N1) = Val(Mid$(str_tmp, 11, 5)) 'Node number of corner K for first surface element LL(I - N1) = Val(Mid$(str_tmp, 16, 5)) 'Node number of corner L for first surface element LMAT(I) = Val(Mid$(str_tmp, 21, 5)) 'Material type for this surface element <=NBCMAT LFIRE(I) = Val(Mid$(str_tmp, 26, 5)) 'Fire number for this surface element
If I + 1 > I2 Then Exit For LI(I + 1) = Val(Mid$(str_tmp, 31, 5)) LJ(I - NFBC2D + 1) = Val(Mid$(str_tmp, 36, 5)) LK(I - N1 + 1) = Val(Mid$(str_tmp, 41, 5)) LL(I - N1 + 1) = Val(Mid$(str_tmp, 46, 5)) LMAT(I + 1) = Val(Mid$(str_tmp, 51, 5)) LFIRE(I + 1) = Val(Mid$(str_tmp, 56, 5))
Next I ' ' CHECK VALIDITY OF MATERIAL REQUIREMENTS AND PREVIOUSLY DECLARED ' BOUNDARY CONDITIONS. FOR A SURFACE TO BE CONSIDERED A FIRE B.C. ' IT MUST BE BOUNDED BY NODES THAT HAVE A DECLARED FLOW B.C. ' Dim KK As Integer Dim LLL As Integer For I = 1 To NS3 If LMAT(I + N1) > NBCMAT Then GoTo lab140 II = LI(I + N1) JJ = LJ(I + NFBC2D) KK = LK(I) LLL = LL(I) 'If KODE(II) = "TEMP" Or KODE(JJ) = "TEMP" Then GoTo lab140 'If KODE(KK) = "TEMP" Or KODE(LLL) = "TEMP" Then GoTo lab140 If KODE(II) = TEMP Or KODE(JJ) = TEMP Then GoTo lab140 If KODE(KK) = TEMP Or KODE(LLL) = TEMP Then GoTo lab140 Next I GoTo lab150 ' lab140: Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " - - - PROGRAM TERMINATED - FIRE BC INPUT ERROR - - - "; _ I, LI(I + N1), LJ(I + NFBC2D), LK(I), LL(I), LMAT(I + N1), LFIRE(I + N1) Close #NIN Close #NOUT End '<<<<<<<< ' ' CALCULATE THE AREA OF THE FIRE BC SURFACE ELEMENTS ' lab150: Dim XL1 As Double Dim XL2 As Double For I = 1 To NS3 II = LI(I + N1) JJ = LJ(NFBC2D + I) KK = LK(I) DX = X(II) - X(JJ) DY = Y(II) - Y(JJ) DZ = Z(II) - Z(JJ) D = DX * DX + DY * DY + DZ * DZ XL1 = Sqr(D) DX = X(JJ) - X(KK) DY = Y(JJ) - Y(KK) DZ = Z(JJ) - Z(KK) D = DX * DX + DY * DY + DZ * DZ XL2 = Sqr(D) AIJKL(I + N1) = XL1 * XL2 Select Case (LK(I) - LL(I)) Case Is < 0 GoTo lab170 Case Is = 0 GoTo lab160 Case Is > 0 GoTo lab170 End Select lab160: AIJKL(I + N1) = 0.5 * AIJKL(I + N1) lab170: Next I ' ' OUTPUT SURFACE ELEMENT DATA ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, " DESCRIPTION OF SURFACE DIRECTLY EXPOSED TO FIRE" Print #NOUT, "" Print #NOUT, " FIREBC NODE NODE NODE NODE MAT FIRE AREA" Print #NOUT, " SURFACE I J K L TYPE TYPE" Print #NOUT, "" For I = 1 To NS3 Print #NOUT, I, LI(I + N1), LJ(I + NFBC2D), LK(I), LL(I), LMAT(I + N1), LFIRE(I + N1), AIJKL(I + N1) Next I ' ' REDUCE THE SURFACE AREA BY 1/4 TO AID IN FUTURE COMPUTATION ' For I = I1 To I2 AIJKL(I) = 0.25 * AIJKL(I) Next I ' lab190: ' ' ' End Sub
Private Sub FIRE(LI() As Integer, LJ() As Integer, LK() As Integer, LL() As Integer, _ LMAT() As Integer, LFIRE() As Integer, AIJKL() As Double, MAT() As Integer, _ FXYS() As Tipo_XYS, T() As Double, TFIRE() As Double, B() As Double) ' ' ' SUBROUTINE *FIRE* CALCULATES THE HEAT FLOW ASSOCIATED WITH A FIRE ' REPRESENTED THROUGH TEMPERATURES TFIRE(I). THESE HEAT FLOWS ' ARE DETERMINED UPON THE BASIS OF THE ASSUMED TEMPERATURE VECTOR T. ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'COMMON /SURFACE/ NS1,NS2,NS3 'DIMENSION LI(1), LJ(1), LMAT(1), LFIRE(1), AIJKL(1), MAT(1), FXYS(1), 'T(1), TFIRE(1), TF4(4), B(1), LK(1), LL(1) ' ' IF BOUNDARY CONDITION IS NONLINEAR TAKE FIRE TEMPERATURES TO ' THEIR FOURTH POWERS ' Dim TF4(4) As Double Dim SB As Double Dim TSHIFT As Double Dim TF As Double 'TFIRE(I) - TEMPERATURE OF FIRE FOR CURRENT TIME STEP, I CAN VARY FROM 1 TO 4 'If NBCTYP = "LINEAR BC " Then GoTo lab20 If NBCTYP = LINEAR_BC Then GoTo lab20 SB = FXYS(1).X 'SB - STEFAN BOLZTMANN CONSTANT TSHIFT = FXYS(2).X 'TSHIFT - SHIFT TO ABSOLUTE TEMPERATURE SCALE Dim I As Integer For I = 1 To 4 TF = TFIRE(I) + TSHIFT 'TF4(I)=(TFIRE+TSHIFT)^4, I CAN VARY FROM 1 TO 4 TF = TF * TF TF4(I) = TF * TF Next I ' ' O N E - D I M E N S I O N A L E L E M E N T S ' lab20: If NS1 = 0 Then GoTo lab40 Dim N As Integer For N = 1 To NS1 ' ' ESTABLISH BASIC FIRE B.C. VARIABLES FOR THIS SURFACE ELEMENT ' Dim N3 As Integer Dim M As Integer Dim LF As Integer Dim TS As Double Dim Q As Double N3 = N I = LI(N) M = LMAT(N) LF = LFIRE(N) TF = TFIRE(LF) TS = T(I) ' ' FIND HEAT FLOW DUE TO FIRE B.C. ' Q = QFIRE(TF, TS, LF, NBCTYP, M, N3, TSHIFT, SB, TF4(), MAT(), FXYS(), AIJKL()) ' ' ADD HEAT FLOW TO NODES BOUNDING SURFACE ELEMENT ' B(I) = B(I) + Q Next N ' ' T W O - D I M E N S I O N A L E L E M E N T S ' lab40: If NS2 = 0 Then GoTo lab60 Dim J As Integer For N = 1 To NS2 ' ' ESTABLISH BASIC FIRE B.C. VARIABLES FOR THIS SURFACE ELEMENT ' N3 = N + NFBC1D I = LI(N3) J = LJ(N) M = LMAT(N3) LF = LFIRE(N3) TF = TFIRE(LF) TS = 0.5 * (T(I) + T(J)) ' ' FIND HEAT FLOW DUE TO FIRE B.C. ' Q = QFIRE(TF, TS, LF, NBCTYP, M, N3, TSHIFT, SB, TF4(), MAT(), FXYS(), AIJKL()) ' ' ADD HEAT FLOW TO NODES BOUNDING SURFACE ELEMENT ' B(I) = B(I) + Q B(J) = B(J) + Q Next N ' ' T H R E E - D I M E N S I O N A L E L E M E N T S ' lab60: If NS3 = 0 Then GoTo lab80 Dim NK As Integer Dim NL As Integer For N = 1 To NS3 ' ' ESTABLISH BASIC FIRE B.C. VARIABLES FOR THIS SURFACE ELEMENT ' N3 = N + NFBC1D + NFBC2D I = LI(N3) J = LJ(N + NFBC2D) NK = LK(N) NL = LL(N) M = LMAT(N3) LF = LFIRE(N3) TF = TFIRE(LF) TS = 0.25 * (T(I) + T(J) + T(NK) + T(NL)) ' ' FIND HEAT FLOW DUE TO FIRE B.C. ' Q = QFIRE(TF, TS, LF, NBCTYP, M, N3, TSHIFT, SB, TF4(), MAT(), FXYS(), AIJKL()) ' ' ADD HEAT FLOW TO NODES BOUNDING SURFACE ELEMENT ' B(I) = B(I) + Q B(J) = B(J) + Q B(NK) = B(NK) + Q B(NL) = B(NL) + Q Next N ' lab80: End Sub
Private Function QFIRE(TF As Double, TS As Double, LF As Integer, NBCTYP As Tipo_NBCTYP, M As Integer, N3 As Integer, TSHIFT As Double, _ SB As Double, TF4() As Double, MAT() As Integer, FXYS() As Tipo_XYS, AIJKL() As Double) As Double ' ' ' FUNCTION *QFIRE* FINDS HEAT FLOW DUE TO FIRE ON SURFACE ELEMENT ' ' 'DIMENSION TF4(1), MAT(1), FXYS(1), AIJKL(1) ' ' Dim DT As Double DT = TF - TS 'If NBCTYP = "NON-LIN BC" Then GoTo lab10 If NBCTYP = NONLIN_BC Then GoTo lab10 ' ' LINEAR FIRE BOUNDARY CONDITION ' Dim JJ As Integer Dim K As Integer Dim TA As Double Dim H As Double Dim Q As Double
M = (M - 1) * 2 JJ = MAT(M + 1) K = MAT(M + 2) TA = 0.5 * (TF + TS) 'H = VMAT(K, FXYS(JJ), FXYS(JJ + K), FXYS(JJ + K + K), TA, " H(T) ") H = VMAT(JJ, K, FXYS(), TA, " H(T) ") '---------tex Q = AIJKL(N3) * H * DT GoTo lab50 ' lab10: ' ' NON-LINEAR FIRE BOUNDARY CONDITION ' Dim A As Double Dim QC As Double Dim P As Double Dim SIGN As Double Dim V As Double Dim QR As Double Dim AB As Double Dim EF As Double Dim ES As Double
K = MAT(M) A = FXYS(K).X 'CONVECT FACTOR QC = 0# If A = 0# Then GoTo lab30 ' ' CALCULATE CONVECTION TERM - QC ' P = FXYS(K + 1).X 'CONVECT POWER If P = 1# Then GoTo lab20 SIGN = 1# If DT < 0# Then SIGN = -1# DT = SIGN * DT QC = SIGN * A * DT ^ P 'QC=A*(TF-TS)^P GoTo lab30 lab20: QC = A * DT lab30: V = FXYS(K + 2).X 'VIEW FACTOR QR = 0# If V = 0# Then GoTo lab40 ' ' CALCULATE RADIATION TERM - QR ' TS = TS + TSHIFT 'TS=(TS+TSHIFT)^4 TS = TS * TS TS = TS * TS AB = FXYS(K + 3).X 'ABSORBT EF = FXYS(K + 4).X 'FIRE EMISSIV ES = FXYS(K + 5).X 'SURFACE EMISSIV QR = SB * V * (AB * EF * TF4(LF) - ES * TS) 'QR=SB*V*(AB*EF*(TFIRE+TSHIFT)^4-ES*(TS+TSHIFT)^4) lab40: Q = AIJKL(N3) * (QC + QR) lab50: QFIRE = Q ' End Function
Private Sub EXOELS(X() As Double, Y() As Double, Z() As Double, LM() As Integer, _ BAREA() As Double, THICK() As Double, VOLUME() As Double, _ IEL() As Integer, IMAT() As Integer, VEL() As Double) ' ' ' SUBROUTINE *EXOELS* INPUTS DATA DESCRIBING ALL ELEMENTS WHICH HAVE ' INTERNAL HEAT GENERATION ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'COMMON /EXOTH/ NINT1D,NINT2D,NINT3D,NINT,NQINT 'DIMENSION X(1), Y(1), Z(1), LM(1), BAREA(1), THICK(1), VOLUME(1),IEL (1), IMAT(1), VEL(1) ' ' O N E - D I M E N S I O N A L E L E M E N T S ' If NINT1D = 0 Then GoTo lab20 ' ' INPUT 1-D ELEMENTS WITH INTERNAL HEAT GENERATION - 8 ELEMENTS/CARD ' '------------------------------------------------------------ ' Data for One-Dimensional Elements (16I5) '------------------------------------------------------------ Dim I As Integer For I = 1 To NINT1D Step 8 Line Input #NIN, str_tmp If I > NINT1D Then Exit For IEL(I) = Val(Mid$(str_tmp, 1, 5)) 'Element number of first one-dimensional bar element undergoing internal heating IMAT(I) = Val(Mid$(str_tmp, 6, 5)) 'Heat function for first element If I + 1 > NINT1D Then Exit For IEL(I + 1) = Val(Mid$(str_tmp, 11, 5)) IMAT(I + 1) = Val(Mid$(str_tmp, 16, 5))
If I + 2 > NINT1D Then Exit For IEL(I + 2) = Val(Mid$(str_tmp, 21, 5)) IMAT(I + 2) = Val(Mid$(str_tmp, 26, 5))
If I + 3 > NINT1D Then Exit For IEL(I + 3) = Val(Mid$(str_tmp, 31, 5)) IMAT(I + 3) = Val(Mid$(str_tmp, 36, 5))
If I + 4 > NINT1D Then Exit For IEL(I + 4) = Val(Mid$(str_tmp, 41, 5)) IMAT(I + 4) = Val(Mid$(str_tmp, 46, 5))
If I + 5 > NINT1D Then Exit For IEL(I + 5) = Val(Mid$(str_tmp, 51, 5)) IMAT(I + 5) = Val(Mid$(str_tmp, 56, 5))
If I + 6 > NINT1D Then Exit For IEL(I + 6) = Val(Mid$(str_tmp, 61, 5)) IMAT(I + 6) = Val(Mid$(str_tmp, 66, 5))
If I + 7 > NINT1D Then Exit For IEL(I + 7) = Val(Mid$(str_tmp, 71, 5)) IMAT(I + 7) = Val(Mid$(str_tmp, 76, 5)) Next I ' ' FIND VOLUME OF ELEMENTS AND OUTPUT DATA ' Dim N As Integer Dim IE As Integer Dim II As Integer Dim JJ As Integer Dim DX As Double Dim DY As Double Dim DZ As Double Dim DL As Double For N = 1 To NINT1D IE = IEL(N) II = LM(2 * IE - 1) JJ = LM(2 * IE) DX = X(II) - X(JJ) DY = Y(II) - Y(JJ) DZ = Z(II) - Z(JJ) DL = Sqr(DX * DX + DY * DY + DZ * DZ) VEL(N) = DL * BAREA(IE) Next N
Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . THERE ARE "; NINT1D; " 1-D EXOTHERMIC ELEMENTS . ." Print #NOUT, "" Print #NOUT, "" Print #NOUT, " N EL FUN VOLUME N EL FUN VOLUME" For I = 1 To NINT1D Print #NOUT, I, IEL(I), IMAT(I), VEL(I), If I Mod 2 = 0 Then Print #NOUT, "" Next I Print #NOUT, "" ' ' T W O - D I M E N S I O N A L E L E M E N T S ' lab20: If NINT2D = 0 Then GoTo lab40 ' ' INPUT 2-D ELEMENTS WITH INTERNAL HEAT GENERATION - 8 ELEMENTS/CARD ' '------------------------------------------------------------ ' Data for Two-Dimensional Elements (16I5) '------------------------------------------------------------ Dim I1 As Integer Dim I2 As Integer I1 = NINT1D + 1 I2 = NINT1D + NINT2D For I = I1 To I2 Line Input #NIN, str_tmp If I > I2 Then Exit For IEL(I) = Val(Mid$(str_tmp, 1, 5)) 'Element number of first two-dimensional line element undergoing internal heating IMAT(I) = Val(Mid$(str_tmp, 6, 5)) 'Heat function for first element If I + 1 > I2 Then Exit For IEL(I + 1) = Val(Mid$(str_tmp, 11, 5)) IMAT(I + 1) = Val(Mid$(str_tmp, 16, 5))
If I + 2 > I2 Then Exit For IEL(I + 2) = Val(Mid$(str_tmp, 21, 5)) IMAT(I + 2) = Val(Mid$(str_tmp, 26, 5))
If I + 3 > I2 Then Exit For IEL(I + 3) = Val(Mid$(str_tmp, 31, 5)) IMAT(I + 3) = Val(Mid$(str_tmp, 36, 5))
If I + 4 > I2 Then Exit For IEL(I + 4) = Val(Mid$(str_tmp, 41, 5)) IMAT(I + 4) = Val(Mid$(str_tmp, 46, 5))
If I + 5 > I2 Then Exit For IEL(I + 5) = Val(Mid$(str_tmp, 51, 5)) IMAT(I + 5) = Val(Mid$(str_tmp, 56, 5))
If I + 6 > I2 Then Exit For IEL(I + 6) = Val(Mid$(str_tmp, 61, 5)) IMAT(I + 6) = Val(Mid$(str_tmp, 66, 5))
If I + 7 > I2 Then Exit For IEL(I + 7) = Val(Mid$(str_tmp, 71, 5)) IMAT(I + 7) = Val(Mid$(str_tmp, 76, 5)) Next I ' ' FIND VOLUME OF ELEMENTS AND OUTPUT DATA ' Dim IARG As Integer Dim KK As Integer Dim LL As Integer Dim AJ As Double Dim AK As Double Dim BJ As Double Dim BK As Double Dim AREA As Double For N = I1 To I2 IE = IEL(N) IARG = 2 * NEL1D + 4 * IE - 3 II = LM(IARG) JJ = LM(IARG + 1) KK = LM(IARG + 2) LL = LM(IARG + 3) AJ = X(JJ) - X(II) AK = X(KK) - X(II) BJ = Y(JJ) - Y(II) BK = Y(KK) - Y(II) AREA = (AJ * BK - AK * BJ) / 2# AJ = X(KK) - X(II) AK = X(LL) - X(II) BJ = Y(KK) - Y(II) BK = Y(LL) - Y(II) AREA = AREA + (AJ * BK - AK * BJ) / 2# VEL(N) = AREA * THICK(IE) Next N
Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . THERE ARE "; NINT2D; " 2-D EXOTHERMIC ELEMENTS . ." Print #NOUT, "" Print #NOUT, "" Print #NOUT, " N EL FUN VOLUME N EL FUN VOLUME" For I = 1 To NINT2D Print #NOUT, I, IEL(I + NINT1D), IMAT(I + NINT1D), VEL(I + NINT1D), If I Mod 2 = 0 Then Print #NOUT, "" Next I Print #NOUT, "" ' ' T H R E E - D I M E N S I O N A L E L E M E N T S ' lab40: If NINT3D = 0 Then GoTo lab60 ' ' INPUT 3-D ELEMENTS WITH INTERNAL HEAT GENERATION - 8 ELEMENTS/CARD ' '------------------------------------------------------------ ' Data for Three-Dimensional Elements (16I5) '------------------------------------------------------------ I1 = NINT1D + NINT2D + 1 I2 = NINT For I = I1 To I2 Step 8 Line Input #NIN, str_tmp If I > I2 Then Exit For IEL(I) = Val(Mid$(str_tmp, 1, 5)) 'Element number of first three-dimensional corner element undergoing internal heating IMAT(I) = Val(Mid$(str_tmp, 6, 5)) 'Heat function for first element If I + 1 > I2 Then Exit For IEL(I + 1) = Val(Mid$(str_tmp, 11, 5)) IMAT(I + 1) = Val(Mid$(str_tmp, 16, 5))
If I + 2 > I2 Then Exit For IEL(I + 2) = Val(Mid$(str_tmp, 21, 5)) IMAT(I + 2) = Val(Mid$(str_tmp, 26, 5))
If I + 3 > I2 Then Exit For IEL(I + 3) = Val(Mid$(str_tmp, 31, 5)) IMAT(I + 3) = Val(Mid$(str_tmp, 36, 5))
If I + 4 > I2 Then Exit For IEL(I + 4) = Val(Mid$(str_tmp, 41, 5)) IMAT(I + 4) = Val(Mid$(str_tmp, 46, 5))
If I + 5 > I2 Then Exit For IEL(I + 5) = Val(Mid$(str_tmp, 51, 5)) IMAT(I + 5) = Val(Mid$(str_tmp, 56, 5))
If I + 6 > I2 Then Exit For IEL(I + 6) = Val(Mid$(str_tmp, 61, 5)) IMAT(I + 6) = Val(Mid$(str_tmp, 66, 5))
If I + 7 > I2 Then Exit For IEL(I + 7) = Val(Mid$(str_tmp, 71, 5)) IMAT(I + 7) = Val(Mid$(str_tmp, 76, 5)) Next I ' ' FIND VOLUME OF ELEMENTS AND OUTPUT DATA ' For N = I1 To I2 IE = IEL(N) VEL(N) = VOLUME(IE) Next N Dim N1 As Integer N1 = NINT1D + NINT2D Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . THERE ARE "; NINT3D; " 3-D EXOTHERMIC ELEMENTS . ." Print #NOUT, "" Print #NOUT, "" Print #NOUT, " N EL FUN VOLUME N EL FUN VOLUME" For I = 1 To NINT2D Print #NOUT, I, IEL(I + N1), IMAT(I + N1), If I Mod 2 = 0 Then Print #NOUT, "" Next I Print #NOUT, "" ' ' lab60: ' ' ' ' End Sub
Private Sub EXOFUN(IEXO() As Integer, EXYS() As Tipo_XYS, NSTORE As Integer) ' ' ' SUBROUTINE *EXOFUN* INPUTS THE EXOTHERMIC HEAT GENERATION CURVE ' AS A LINEARIZED FUNCTION OF TIME ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'COMMON /EXOTH/ NINT1D,NINT2D,NINT3D,NINT,NQINT 'DIMENSION IEXO(1), EXYS(1) NSTORE = 1 ' ' OUTPUT PAGE HEADING ' Print #NOUT, "6" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " ************************************************************" Print #NOUT, "" Print #NOUT, " FIRES-T3 - FIRE RESPONSE OF STRUCTURES - THERMAL" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " "; ITITLE Print #NOUT, "" Print #NOUT, " INTERNAL HEAT GENERATION INFORMATION" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " THERE ARE"; NQINT; " DIFFERENT HEAT FUNCTIONS" Print #NOUT, "" Print #NOUT, " ************************************************************"
' Dim N As Integer For N = 1 To NQINT ' ' READ CONTROL CARD ' ' NSTORE = IEXO(1) - STARTING POINT FOR FUNCTION N IN EXYS ' MK = IEXO(2) - NUMBER OF POINTS IN INPUT HEATING CURVE ' MT = IEXO(3) - TYPE OF INPUT HEATING DATA ' EQ. 0 - HEAT RATE PER UNIT VOLUME ' EQ. 1 - HEAT RATE PER UNIT MASS ' Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, "" Print #NOUT, " . . . . FUNCTION NUMBER "; N; " . . . ." Print #NOUT, "" Dim MK As Integer Dim MT As Integer Dim MS As Integer
'------------------------------------------------------------ ' Control Card (2I5) '------------------------------------------------------------ Line Input #NIN, str_tmp MK = Val(Mid$(str_tmp, 1, 5)) 'Number of points used to define heating function 'MK>=2 MT = Val(Mid$(str_tmp, 6, 5)) 'Type of heating curve input 'If MT=0, heat flow per unit volume 'If MT=1, heat flow per unit mass MS = (N - 1) * 3 IEXO(MS + 1) = NSTORE IEXO(MS + 2) = MK IEXO(MS + 3) = MT ' ' INPUT HEATING FUNCTION ' '------------------------------------------------------------ ' Heat function (8E10.0) '------------------------------------------------------------ Dim I As Integer Dim M As Integer ReDim Preserve EXYS(1 To NSTORE + MK - 1) As Tipo_XYS For I = 1 To MK Step 4 Line Input #NIN, str_tmp If I > MK Then Exit For EXYS(NSTORE + I - 1).X = Val(Mid$(str_tmp, 1, 10)) 'Time of point 1 EXYS(NSTORE + I - 1).Y = Val(Mid$(str_tmp, 11, 10)) 'Value of heat rate at point 1 If I + 1 > MK Then Exit For EXYS(NSTORE + I - 1 + 1).X = Val(Mid$(str_tmp, 21, 10)) EXYS(NSTORE + I - 1 + 1).Y = Val(Mid$(str_tmp, 31, 10)) If I + 2 > MK Then Exit For EXYS(NSTORE + I - 1 + 2).X = Val(Mid$(str_tmp, 41, 10)) EXYS(NSTORE + I - 1 + 2).Y = Val(Mid$(str_tmp, 51, 10)) If I + 3 > MK Then Exit For EXYS(NSTORE + I - 1 + 3).X = Val(Mid$(str_tmp, 61, 10)) EXYS(NSTORE + I - 1 + 3).Y = Val(Mid$(str_tmp, 71, 10)) Next I M = MK - 1 ' ' DETERMINE SLOPES AND PRINT HEATING FUNCTION ' For I = 1 To M EXYS(NSTORE + I - 1).S = (EXYS(NSTORE + I).Y - EXYS(NSTORE + I - 1).Y) / (EXYS(NSTORE + I).X - EXYS(NSTORE + I - 1).X) Next I Print #NOUT, "" Print #NOUT, " NODE TIME HEAT SLOPE" Print #NOUT, "" For I = 1 To M Print #NOUT, I, EXYS(NSTORE + I - 1).X; " "; EXYS(NSTORE + I - 1).Y Print #NOUT, " "; EXYS(NSTORE + I - 1).S Print #NOUT, "" Next I Print #NOUT, MK, EXYS(NSTORE + MK - 1).X; " "; EXYS(NSTORE + MK - 1).Y NSTORE = NSTORE + MK Next N ' ' ' ' End Sub
Private Sub QEXO(LM() As Integer, IEL() As Integer, IMAT() As Integer, IEXO() As Integer, _ EXYS() As Tipo_XYS, AT() As Double, MATL() As Integer, VEL() As Double, _ MMTYPE() As Integer, B() As Double, XYS() As Tipo_XYS, TIME As Double) ' ' ' SUBROUTINE *QEXO* COMPUTES NODAL HEAT FLOW DUE TO EXOTHERMIC ' REACTION WITHIN ELEMENTS ' ' 'COMMON /CONTROL/ ITITLE(6),IREAD(80),NIN,NOUT,NPUNCH,NUMNP,NEL1D, 'NEL2D , NEL3D, NUMEL, MBAND, NMAT, NFBC1D, NFBC2D, NFBC3D, NBCMAT, NBCTYP 'COMMON /EXOTH/ NINT1D,NINT2D,NINT3D,NINT,NQINT 'DIMENSION LM(1), IEL(1), IMAT(1), IEXO(1), EXYS(1), AT(1), MATL(1), VEL(1), MMTYPE(1), B(1), XYS(1) ' ' O N E - D I M E N S I O N A L E L E M E N T S ' If NINT1D = 0 Then GoTo lab30 Dim N As Integer Dim IE As Integer Dim II As Integer Dim JJ As Integer Dim MS As Integer Dim J As Integer Dim K As Integer Dim LTYPE As Integer Dim Q As Double Dim TEMP As Double Dim DENS As Double Dim QADD As Double For N = 1 To NINT1D IE = IEL(N) II = LM(2 * IE - 1) JJ = LM(2 * IE) MS = IMAT(N) MS = 3 * (MS - 1) J = IEXO(MS + 1) K = IEXO(MS + 2) LTYPE = IEXO(MS + 3) 'Q = VMAT(K, EXYS(J), EXYS(J + K), EXYS(J + K + K), TIME, "HEAT FUNCT") Q = VMAT(J, K, EXYS(), TIME, "HEAT FUNCT") '---------tex If LTYPE = 0 Then GoTo lab10 TEMP = AT(IE) MS = MMTYPE(IE) MS = (MS - 1) * 6 J = MATL(MS + 5) K = MATL(MS + 6) 'DENS = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " DENS") DENS = VMAT(J, K, XYS(), TEMP, " DENS") '---------tex Q = Q * DENS lab10: QADD = Q * VEL(N) / 2# B(II) = B(II) + QADD B(JJ) = B(JJ) + QADD Next N ' ' T W O - D I M E N S I O N A L E L E M E N T S ' lab30: If NINT2D = 0 Then GoTo lab60 Dim I1 As Integer Dim I2 As Integer Dim N1 As Integer Dim KK As Integer Dim LL As Integer I1 = NINT1D + 1 I2 = NINT1D + NINT2D For N = I1 To I2 IE = IEL(N) N1 = 2 * NEL1D + 4 * IE II = LM(N1 - 3) JJ = LM(N1 - 2) KK = LM(N1 - 1) LL = LM(N1) MS = IMAT(N) MS = 3 * (MS - 1) J = IEXO(MS + 1) K = IEXO(MS + 2) LTYPE = IEXO(MS + 3) 'Q = VMAT(K, EXYS(J), EXYS(J + K), EXYS(J + K + K), TIME, "HEAT FUNCT") Q = VMAT(J, K, EXYS(), TIME, "HEAT FUNCT") '---------tex If LTYPE = 0 Then GoTo lab40 TEMP = AT(NEL1D + IE) MS = MMTYPE(NEL1D + IE) MS = (MS - 1) * 6 J = MATL(MS + 5) K = MATL(MS + 6) 'DENS = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " DENS") DENS = VMAT(J, K, XYS(), TEMP, " DENS") '---------tex Q = Q * DENS lab40: QADD = Q * VEL(N) / 4# B(II) = B(II) + QADD B(JJ) = B(JJ) + QADD B(KK) = B(KK) + QADD B(LL) = B(LL) + QADD Next N ' ' T H R E E - D I M E N S I O N A L E L E M E N T S ' lab60: If NINT3D = 0 Then GoTo lab90 Dim III As Integer Dim JJJ As Integer Dim KKK As Integer Dim LLL As Integer I1 = NINT1D + NINT2D + 1 I2 = NINT For N = I1 To I2 IE = IEL(N) N1 = 2 * NEL1D + 4 * NEL2D + 8 * IE II = LM(N1 - 7) JJ = LM(N1 - 6) KK = LM(N1 - 5) LL = LM(N1 - 4) III = LM(N1 - 3) JJJ = LM(N1 - 2) KKK = LM(N1 - 1) LLL = LM(N1) MS = IMAT(N) MS = (MS - 1) * 3 J = IEXO(MS + 1) K = IEXO(MS + 2) LTYPE = IEXO(MS + 3) 'Q = VMAT(K, EXYS(J), EXYS(J + K), EXYS(J + K + K), TIME, "HEAT FUNCT") Q = VMAT(J, K, EXYS(), TIME, "HEAT FUNCT") '---------tex If LTYPE = 0 Then GoTo lab70 TEMP = AT(NEL1D + NEL2D + IE) MS = MMTYPE(NEL1D + NEL2D + IE) MS = (MS - 1) * 6 K = MATL(MS + 6) J = MATL(MS + 5) 'DENS = VMAT(K, XYS(J), XYS(J + K), XYS(J + K + K), TEMP, " DENS") DENS = VMAT(J, K, XYS(), TEMP, " DENS") '---------tex Q = Q * DENS lab70: QADD = Q * VEL(N) / 8# B(II) = B(II) + QADD B(JJ) = B(JJ) + QADD B(KK) = B(KK) + QADD B(LL) = B(LL) + QADD B(III) = B(III) + QADD B(JJJ) = B(JJJ) + QADD B(KKK) = B(KKK) + QADD B(LLL) = B(LLL) + QADD Next N ' lab90:
End Sub
|
|