Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

ULARC

JohnNichols
Valued Contributor III
535 Views

Jim:

I have talked about ULARC before now.  

It was written by Powell's group in about 1970 and I have been using it since 1980. Quick, simple, dirty Fortran but powerful.  

It was designed for Plastic Analysis of Frames.  

I have been using it on a large bridge in Europe and it has been good as a Monte Carlo base.  

I had to add the entry bridge span, a flat slab to the big model.  It is crashing with an interesting set of errors, took me a while to work out what was missing from the original code, they had not thought of a flat beam by itself. 

Line 1 has the axial load at V(?), and with portal frames there is always axial load, so no problems from Xmas 1981 until Thanksgiving 2023, a blasted long time.  

But with a flat beam there is no axial load and line 49 gives me IX = 0

So then line 55 throws an exception as I am trying to look up the zeroth element of the applied moments, with IX.    We are after the ratio of the applied moments and axial loads to the allowed to determine where the plastic hinges should be placed.   So here it is a first guess. Only took 2 weeks to solve to and work out if it was an insurmountable problem in the time available. 

ULARC is the precursor to Drain.  Anyway, A. SUDHAKAR. wrote ULARC and in the 1990s I tried to track him down to talk about the program.  His kind wife replied and said that he had died.  I wrote her a very nice letter saying her husband was a tremendous engineer and a good programmer.  A nice response from her.  

A master's student in six months wrote a world class analysis program for those of us who do not mind quick, dirty Fortran of the 77 kind.  Powell's group was fantastic, pity they are all gone. 

 

Any way merry XMAS

John

        S(NE,1)=E(N)*AA(N)*V(1)/ELL
        S(NE,2)=XM*(SKII(N)*V(2)+SKIJ(N)*V(3))
        S(NE,3)=XM*(SKIJ(N)*V(2)+SKJJ(N)*V(3))
        !
        !     CHECK PLASTIC WORK FOR CLOSED HINGES
        !
        IF (STOT(NE,2)*VP(NE,2).GE.0.) GO TO 70
        ICLOSE=1
        IHI(NE)=0
        write (sw,60) NE,NODI(NE)
        write (sw,61) NE,NODI(NE)
60      FORMAT(//21H HINGE CLOSES, MEMBER,I4,6H, NODE,I4)
61      FORMAT(  21H HINGE CLOSES, MEMBER,I4,6H, NODE,I4)
70      IF (STOT(NE,3)*VP(NE,3).GE.0.) GO TO 80
        ICLOSE=1
        IHJ(NE)=0
        write (sw,60) NE,NODJ(NE)
        !
80  CONTINUE
    !
    !     REPEAT IF HINGES CLOSED
    Factor = 1.0
    max = 0.0
    !
    IF (ICLOSE.EQ.1) RETURN
    !
    !     DETERMINE MINIMUM LOAD FACTOR INCREMENT FOR NEXT HINGE
    !
    outer: do I = 1,10

        RATIOI=1.E10
        RATIOJ=1.E10
        INEL=0
        JNEL=0
        !write(*,86)
86      Format("                             Lambda Factor Table",/&
            "                             Type Elem SECT   AXIAL         Moments       Moment    LAMBDA       AXIAL      Axial      Axial      Bending     Adjusted",/&
            "                              Num Type        FORCE        1       2     Capacity   VALUE       Capacity   Vector      Force      Moment      Lambda"/&
            "                                               kN         kNm      kNm      kNm                   kN       Offset        Table Data",/&
            "                                                                                                                         kN         kNm",/)
        DO 160 NE=1,NELS
            !write(*,*)IHI(NE)
            IF (IHI(NE) .GT. 0) GO TO 120
            NS=NSECI(NE)
            DELS=S(NE,2)       
            write(*,*)NE, S(NE,2),DELS                                                      !  Checks if moment is applied
            IF (DELS) 100,120,90
90          RAT=(YMP(NS)-STOT(NE,2))/DELS
            IX = ceiling(ABS(S(NE,1)*FACTOR(I))/(MM*MM))            !     Checks if there is an axial load
            IF(IX .eq. 0) then 
                write(*,*)"                                        Here 1",ne
                ix = 1
            endif
            write(sRT,*)1,IX,NS,S(NE,1),FACTOR(I)
            RATA = RAT * (YA(IX,NS)/(YMP(NS)))
            ELTYPE = 1
            !write(*,85)1,NE,NS,S(NE,1)/MM,S(NE,2)/MM,S(NE,3)/MM,YMP(NS)/MM,RAT,LIMIT(NS),IX,(XA(IX,NS)/MM),(YA(IX,NS)/MM),RATA
85          format("                          ",3I5,4(" ",F9.0),2(" ", F10.1),"   ",I4,2("     ",F9.1),"     ",E9.4,\)

            RAT = RATA
            GO TO 110
100         RAT=(-YMN(NS)-STOT(NE,2))/DELS


            write(sRT,*)2,IX,NS,S(NE,1),FACTOR(I)
            IX = ceiling(ABS(S(NE,1)*FACTOR(I))/(MM*MM))
            IF(IX .eq. 0) then 
                write(*,*)"                                        Here 2",ne
                ix = 1
            endif
            RATA = RAT *(YA(IX,NS)/(YMP(NS)))
            ELTYPE = 2
            !  write(*,85)ELTYPE,NE,NS,S(NE,1)/MM,S(NE,2)/MM,S(NE,3)/MM,YMP(NS)/MM,RAT,LIMIT(NS),IX,(XA(IX,NS)/MM),(YA(IX,NS)/MM),RATA
            RAT = RATA
110         IF (RAT.GT.RATIOI) GO TO 120
            RATIOI=RAT
            INEL=NE
120         IF (IHJ(NE).GT.0) GO TO 160
            NS=NSECJ(NE)
            DELS=S(NE,3)
            IF (DELS) 140,160,130
130         RAT=(YMP(NS)-STOT(NE,3))/DELS
            !write(*,131)rat
131         Format("  ",F7.2)
            GO TO 150
140         RAT=(-YMN(N

Long live Fortran and death to the pirates.    (Adapted from Swallows and Amazons) 

0 Kudos
2 Replies
jimdempseyatthecove
Honored Contributor III
499 Views

Are you sure that by setting XI = 1 is the correct thing to do?

An alternative to consider is to dimension the arrays that use XI as an index to include a lower bound of 0. And then you provide the values to use in those arrays should a flat beam be used.

 

A second alternative to not model a flat beam. Give it some minimal thickness (or whatever dimension/property is missing).

 

Jim Dempsey

 

 

 

0 Kudos
JohnNichols
Valued Contributor III
464 Views

I could do either, but my way uses a minimum capacity as a check, I also count the number of times it occurs which means you had better check it.  It means that the axial load is zero, so it really is not a constraint. 

By flat I mean it is a straight beam not a Portal Frame. The original programmer used only Portal Frames, which is a real limit, think a roof hanging from the edge of a portal frame to cover something like a car.  

 

0 Kudos
Reply