wikipaom2015:lez14
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
wikipaom2015:lez14 [2015/04/24 15:47] – [Subroutine Cnstig] 165198 | wikipaom2015:lez14 [2015/04/27 20:20] (versione attuale) – 166078 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | ======Programma agli elementi finiti triangolari====== | ||
+ | =====Dimensionamento===== | ||
+ | |||
+ | La prima parte del programma si occupa della dichiarazione delle variabili necessarie per definire la struttura; | ||
+ | i parametri NODES e NELEMS identificano una mesh di 9 nodi e 8 elementi. | ||
+ | |||
+ | PARAMETER (NODES=9) | ||
+ | PARAMETER (NELEMS=8) | ||
+ | PARAMETER (IFMAX=3, | ||
+ | DIMENSION XY(2, | ||
+ | ICNXY(2, | ||
+ | FORCE(2*NODES), | ||
+ | |||
+ | **IFMAX**: numero di nodi caricati\\ | ||
+ | **ICNMAX**: numero di nodi vincolati | ||
+ | |||
+ | La stringa " | ||
+ | |||
+ | **XY**: matrice che contiene le coordinate locali\\ | ||
+ | **NVERT**: matrice che contiene il numero dei nodi ai tre vertici di ogni elemento\\ | ||
+ | **IFXY**: vettore che contiene i nomi (i numeri) dei nodi caricati\\ | ||
+ | **FXY**: matrice che contiene le componenti lungo x ed y delle forze applicate\\ | ||
+ | **ICNXY**: matrice che contiene i nomi dei nodi vincolati e gli associa il tipo di vincolamento. | ||
+ | - vincolato solo lungo X | ||
+ | - vincolato solo lungo Y | ||
+ | - vincolato lungo X ed Y | ||
+ | **CNXY**: matrice che contiene gli spostamenti imposti lungo X ed Y\\ | ||
+ | **STRUTK**: matrice di rigidezza dell' | ||
+ | **TK**: vettore dei termini noti\\ | ||
+ | **FORCE**: vettore delle forze imposte\\ | ||
+ | **UV**: vettore spostamenti nodali | ||
+ | |||
+ | DIMENSION D(3, | ||
+ | DELTAEL(6), | ||
+ | |||
+ | Dopo il dimensionamento degli elementi variabili si termina l' | ||
+ | |||
+ | **D**: matrice di legame costitutivo (legge di Hooke), lavorando in 3D diventa una matrice 6x6\\ | ||
+ | **B**: matrice che lega spostamenti e deformazione\\ | ||
+ | **BT**: trasposta di B\\ | ||
+ | **DB**: prodotto tra matrice D e B (matrice temporanea)\\ | ||
+ | **ELK**: matrice di rigidezza degli elementi (aggiornata per ogni elemento, evitando così di avere un array in tre dimensioni 6x6xNELEMS)\\ | ||
+ | **IPOINT**: mappatura dei gdl globali e locali per ogni elemento\\ | ||
+ | **DELTAEL**: | ||
+ | **SIGMAEL**: | ||
+ | |||
+ | =====MAIN===== | ||
+ | |||
+ | OPEN(1, | ||
+ | OPEN(2, | ||
+ | CALL READIN(YM, | ||
+ | ICNMAX, | ||
+ | CALL ECHO(YM, | ||
+ | ICNXY,CNXY) | ||
+ | CALL CLEAR(2*NODES, | ||
+ | CALL CLEAR(2*NODES, | ||
+ | C CALL CLEAR(3, | ||
+ | C CALL CLEAR(6, | ||
+ | CALL DMAT(YM, | ||
+ | | ||
+ | ====Subroutine Readin==== | ||
+ | Lettura del Modulo di Young e del Coefficiente di Poisson e scelta dello stato di Tensione o Deformazione Piana.\\ | ||
+ | Lettura delle coordinate nodali e dei vertici degli elementi triangolari.\\ Lettura delle forze nodali e delle condizioni di vincolamento. | ||
+ | |||
+ | | ||
+ | FXY, | ||
+ | DIMENSION XY(2, | ||
+ | ICNXY(2, | ||
+ | C | ||
+ | READ(1, | ||
+ | C | ||
+ | DO 10, | ||
+ | READ(1, | ||
+ | IF(I10.NE.NODE)THEN | ||
+ | write(*,*) ' | ||
+ | stop | ||
+ | END IF | ||
+ | 10 CONTINUE | ||
+ | C | ||
+ | DO 20, | ||
+ | READ(1, | ||
+ | IF(I20.NE.NELEM)THEN | ||
+ | write(*,*) ' | ||
+ | stop | ||
+ | END IF | ||
+ | 20 CONTINUE | ||
+ | C | ||
+ | DO 30, | ||
+ | READ(1, | ||
+ | 30 CONTINUE | ||
+ | C | ||
+ | DO 40, | ||
+ | READ(1, | ||
+ | 40 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | |||
+ | Per ogni ciclo DO presente nella subroutine il programma esegue un controllo di sequenzialità dei parametri (coordianate nodali, spostamenti e forze applicate) dei file di input. | ||
+ | |||
+ | ====Subroutine Echo==== | ||
+ | Subroutine che controlla la correttezza di lettura dei dati di input. | ||
+ | |||
+ | | ||
+ | ICNMAX, | ||
+ | DIMENSION XY(2, | ||
+ | ICNXY(2, | ||
+ | C | ||
+ | WRITE(2, | ||
+ | WRITE(2, | ||
+ | C | ||
+ | IF(ITDP.EQ.0)THEN | ||
+ | WRITE(2, | ||
+ | END IF | ||
+ | IF(ITDP.EQ.1)THEN | ||
+ | WRITE(2, | ||
+ | END IF | ||
+ | C | ||
+ | WRITE(2, | ||
+ | DO 10, | ||
+ | WRITE(2, | ||
+ | 10 CONTINUE | ||
+ | C | ||
+ | WRITE(2, | ||
+ | DO 20, | ||
+ | WRITE(2, | ||
+ | 20 CONTINUE | ||
+ | C | ||
+ | WRITE(2, | ||
+ | DO 30, | ||
+ | WRITE(2, | ||
+ | 30 CONTINUE | ||
+ | C | ||
+ | WRITE(2, | ||
+ | DO 40, | ||
+ | WRITE(2, | ||
+ | 40 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | ====Subroutine Clear==== | ||
+ | Inizializzazione a zero degli elementi di una matrice. | ||
+ | |||
+ | | ||
+ | DIMENSION A(K1,K2) | ||
+ | DO 10,I10=1,K1 | ||
+ | DO 20,I20=1,K2 | ||
+ | A(I10, | ||
+ | 20 CONTINUE | ||
+ | 10 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | |||
+ | ====Subroutine Dmat==== | ||
+ | Costruzione della matrice D di applicazione del legame Hookeano tra tensioni e deformazioni: | ||
+ | |||
+ | | ||
+ | DIMENSION D(3,3) | ||
+ | IF(ITDP.EQ.0)GO TO 100 | ||
+ | IF(ITDP.EQ.1)GO TO 200 | ||
+ | C Per Stato di Tensione Piana: | ||
+ | 100 CONTINUE | ||
+ | CTP=YM/ | ||
+ | G=YM/ | ||
+ | C | ||
+ | C | 1*CTP PR*CTP | ||
+ | C D = | PR*CTP | ||
+ | C | 0 0 G | | ||
+ | D(1,1)=1. | ||
+ | D(1,2)=PR | ||
+ | D(2,1)=PR | ||
+ | D(2,2)=1. | ||
+ | DO 10,I10=1,2 | ||
+ | DO 20,I20=1,2 | ||
+ | D(I10, | ||
+ | 20 CONTINUE | ||
+ | 10 CONTINUE | ||
+ | D(1,3)=0. | ||
+ | D(2,3)=0. | ||
+ | D(3,1)=0. | ||
+ | D(3,2)=0. | ||
+ | D(3,3)=G | ||
+ | GOTO 300 | ||
+ | C Per Stato di Deformazione Piana: | ||
+ | 200 CONTINUE | ||
+ | CDP=YM*(1-PR)/ | ||
+ | CPR=PR/ | ||
+ | G=YM/ | ||
+ | C | ||
+ | C | 1*CDP | ||
+ | C D = | CDP*CPR | ||
+ | C | 0 0 G | | ||
+ | D(1,1)=1. | ||
+ | D(1,2)=CPR | ||
+ | D(2,1)=CPR | ||
+ | D(2,2)=1. | ||
+ | DO 30,I30=1,2 | ||
+ | DO 40,I40=1,2 | ||
+ | D(I30, | ||
+ | 40 CONTINUE | ||
+ | 30 CONTINUE | ||
+ | D(1,3)=0. | ||
+ | D(2,3)=0. | ||
+ | D(3,1)=0. | ||
+ | D(3,2)=0. | ||
+ | D(3,3)=G | ||
+ | GOTO 300 | ||
+ | 300 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | |||
+ | Per decidere il tipo di legame costitutivo da applicare per la generazione della matrice D, la subroutine legge il valore di ITDP attraverso due costrutti IF: questo genere di approccio potrebbe portare ad errore nel caso in cui ITDP fosse uguale a qualunque altro numero che non sia zero o uno, in quanto la sub continuerebbe con l' | ||
+ | |||
+ | =====MAIN===== | ||
+ | |||
+ | DO 10, | ||
+ | XI=XY(1, | ||
+ | YI=XY(2, | ||
+ | XJ=XY(1, | ||
+ | YJ=XY(2, | ||
+ | XK=XY(1, | ||
+ | YK=XY(2, | ||
+ | CALL AREA(XI, | ||
+ | CALL KELMAT(XI, | ||
+ | C | ||
+ | CALL POINTVT(NELEMS, | ||
+ | CALL ASSEMBL(ELK, | ||
+ | 10 CONTINUE | ||
+ | |||
+ | DO principale per la costruzione della matrice di rigidezza dell' | ||
+ | Scorro tutti gli elementi (I10=1, | ||
+ | |||
+ | ====Subroutine Area==== | ||
+ | |||
+ | |||
+ | Calcolo della superficie DEL di ciascun elemento finito triangolare a partire dalle coordinate nodali dei vertici. Controllo di dimensioni e segno dell' | ||
+ | |||
+ | SUBROUTINE AREA(XI, | ||
+ | TWODEL=XJ*YK+XK*YI+XI*YJ-(XK*YJ+XI*YK+XJ*YI) | ||
+ | AREAMIN=1.E-6 | ||
+ | C | ||
+ | IF(ABS((TWODEL/ | ||
+ | WRITE(*, | ||
+ | WRITE(*, | ||
+ | WRITE(*, | ||
+ | END IF | ||
+ | C | ||
+ | IF((TWODEL/ | ||
+ | WRITE(*, | ||
+ | WRITE(*, | ||
+ | WRITE(*, | ||
+ | END IF | ||
+ | RETURN | ||
+ | END | ||
+ | |||
+ | |||
+ | TWODEL è il determinante della matrice delle coordinate locali. La subroutine effettua un controllo sulle dimensioni minime dell' | ||
+ | **NB**: La mantissa di un numero di macchina dedica 7 bit per la codifica dell' | ||
+ | |||
+ | ====Subroutine Kelmat==== | ||
+ | |||
+ | Costruzione della matrice di rigidezza ELK di ciascun elemento finito triangolare attraverso la formula: F = ELK * DELTA => ELK = A * (BT * D * B). Le coordinate nodali vengono prese, come di consueto, in verso antiorario. | ||
+ | |||
+ | SUBROUTINE KELMAT(XI, | ||
+ | DIMENSION B(3, | ||
+ | CALL CLEAR(3, | ||
+ | CALL BMAT(XI, | ||
+ | CALL PRODMAT(3, | ||
+ | CALL TRSPMAT(3, | ||
+ | CALL PRODMAT(6, | ||
+ | DEL=TWODEL/ | ||
+ | DO 10,I10=1,6 | ||
+ | DO 20,I20=1,6 | ||
+ | ELK(I10, | ||
+ | 20 CONTINUE | ||
+ | 10 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | La matrice D, passata dal main, viene allocata in memoria al lancio della subroutine, mentre la matrice B (locale) richiede un allocamento all' | ||
+ | |||
+ | ====Subroutine Pointvt==== | ||
+ | |||
+ | Costruzione del vettore puntatore IPOINT necessario ad effettuare l' | ||
+ | |||
+ | SUBROUTINE POINTVT(NELEMS, | ||
+ | DIMENSION NVERT(3, | ||
+ | IPOINT(1)=NVERT(1, | ||
+ | IPOINT(2)=NVERT(1, | ||
+ | IPOINT(3)=NVERT(2, | ||
+ | IPOINT(4)=NVERT(2, | ||
+ | IPOINT(5)=NVERT(3, | ||
+ | IPOINT(6)=NVERT(3, | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | ====Subroutine Assembl==== | ||
+ | |||
+ | Assemblaggio della matrice ELK di rigidezza di ciascun elemento finito triangolare nella matrice STRUTK di rigidezza globale della struttura.\\ | ||
+ | La matrice STRUTK viene inzializzata a zero nel MAIN PROGRAM, pertanto si ritiene superflua la sua inizializzazione in questa subroutine. | ||
+ | |||
+ | SUBROUTINE ASSEMBL(ELK, | ||
+ | DIMENSION ELK(6, | ||
+ | DO 10,I10=1,6 | ||
+ | DO 20,I20=1,6 | ||
+ | IND10=IPOINT(I10) | ||
+ | IND20=IPOINT(I20) | ||
+ | STRUTK(IND10, | ||
+ | 20 CONTINUE | ||
+ | 10 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | Nota: il vettore NODES viene utilizzato unicamente per il dimensionamento della matrice STRUTK. | ||
+ | La riga fondamentale della sub è quella che associa ad un valore della matrice di rigidezza globale della struttura il suo vecchio valore + il valore da aggiungere dovuto al nodo considerato, | ||
+ | |||
+ | |||
+ | =====MAIN===== | ||
+ | |||
+ | C Per il Caricamento si richiama questa sub | ||
+ | CALL FORCES(IFMAX, | ||
+ | | ||
+ | ====Subroutine Forces==== | ||
+ | |||
+ | Riempimento del vettore globale delle forze nodali FORCE. | ||
+ | |||
+ | SUBROUTINE FORCES(IFMAX, | ||
+ | DIMENSION IFXY(IFMAX), | ||
+ | DO 10, | ||
+ | INDX=IFXY(I10)*2-1 | ||
+ | INDY=IFXY(I10)*2 | ||
+ | FORCE(INDX)=FXY(1, | ||
+ | FORCE(INDY)=FXY(2, | ||
+ | 10 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | Dove la sub importa dal main il numero di nodi caricati (IFMAX), il vettore contenente il nome dei nodi caricati (IFXY) e la matrice contenente i valori delle forze lungo x e y per ogni singolo nodo. Il ciclo DO legge i nodi caricati e salva i valori delle forze nel vettore dei termini noti. | ||
+ | |||
+ | |||
+ | =====MAIN===== | ||
+ | |||
+ | C Vincolamento | ||
+ | CALL CNSTNG(ICNMAX, | ||
+ | | ||
+ | ====Subroutine Cnstng==== | ||
+ | |||
+ | Imposizione delle condizioni di vincolamento specifiche alla matrice STRUTK di rigidezza globale della struttura ed al vettore globale delle forze nodali FORCE. | ||
+ | |||
+ | SUBROUTINE CNSTNG(ICNMAX, | ||
+ | DIMENSION ICNXY(2, | ||
+ | | ||
+ | DO 10, | ||
+ | IF(ICNXY(2, | ||
+ | IF(ICNXY(2, | ||
+ | IF(ICNXY(2, | ||
+ | WRITE(*, | ||
+ | WRITE(*, | ||
+ | STOP | ||
+ | C Per vincolamento di x: | ||
+ | 100 CONTINUE | ||
+ | INDX=ICNXY(1, | ||
+ | DO 110, | ||
+ | STRUTK(INDX, | ||
+ | FORCE(I110)=FORCE(I110)-STRUTK(I110, | ||
+ | STRUTK(I110, | ||
+ | 110 CONTINUE | ||
+ | STRUTK(INDX, | ||
+ | FORCE(INDX)=CNXY(1, | ||
+ | GO TO 10 | ||
+ | C Per vincolamento di y: | ||
+ | 200 CONTINUE | ||
+ | INDY=ICNXY(1, | ||
+ | DO 210, | ||
+ | STRUTK(INDY, | ||
+ | FORCE(I210)=FORCE(I210)-STRUTK(I210, | ||
+ | STRUTK(I210, | ||
+ | 210 CONTINUE | ||
+ | STRUTK(INDY, | ||
+ | FORCE(INDY)=CNXY(2, | ||
+ | GO TO 10 | ||
+ | C Per vincolamento di x e y: | ||
+ | 300 CONTINUE | ||
+ | INDX=ICNXY(1, | ||
+ | INDY=ICNXY(1, | ||
+ | DO 310, | ||
+ | STRUTK(INDX, | ||
+ | STRUTK(INDY, | ||
+ | FORCE(I310)=FORCE(I310)-STRUTK(I310, | ||
+ | | ||
+ | STRUTK(I310, | ||
+ | STRUTK(I310, | ||
+ | 310 CONTINUE | ||
+ | STRUTK(INDX, | ||
+ | STRUTK(INDY, | ||
+ | FORCE(INDX)=CNXY(1, | ||
+ | FORCE(INDY)=CNXY(2, | ||
+ | GO TO 10 | ||
+ | 10 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | La subroutine importa il numero di nodi vincolati con il tipo di vincolo ad essi assegnato dal main. Le operazioni che permettono la modifica della matrice di rigidezza mantenendo la sua simmetria sono:\\ | ||
+ | 1_annullare tutti i coefficienti della matrice di rigidezza corrispondente alla riga ed alla colonna del grado di libertà vincolato, tranne il termine diagonale che verrà posto uguale ad 1.\\ | ||
+ | 2_si impone il temine noto corrispondente al grado di libertà vincolato pari al valore dello spostamento imposto.\\ | ||
+ | 3_si sottrae da tutti gli altri termini noti il contributo dovuto al prodotto tra i termini della colonna annullati ed il valore imposto dal nostro grado di libertà.\\ | ||
+ | La subroutine considera in maniera distinta i 3 tipi di problema: vincolamento lungo x, vincolamento lungo y, vincolamento lungo x ed y.\\ Per ogni tipo di vincolamento la sub rimanda alle operazioni di modifica della matrice STRUTK attraverso 3 diversi //GOTO//: questo modo di operare rende ridondante il codice, rischiando di moltiplicare eventuali errori tra le diverse operazioni, sarebbe stato più consono un costrutto del tipo IF-ELSE IF- ELSE- ENDIF. | ||
+ | |||
+ | =====MAIN===== | ||
+ | |||
+ | C Soluzione in termini di spostamenti nodali | ||
+ | CALL GAUSS(2*NODES, | ||
+ | WRITE(2, | ||
+ | DO 20, | ||
+ | WRITE(2, | ||
+ | 20 CONTINUE | ||
+ | |||
+ | ====Subroutine Gauss==== | ||
+ | |||
+ | Risoluzione di un sistema algebrico lineare di N equazioni in N incognite attraverso il metodo di Gauss (triangolarizzazione della matrice dei coefficienti).\\ | ||
+ | La matrice dei coefficienti viene denominata C; il vettore dei termini noti B ed il vettore delle incognite V. | ||
+ | |||
+ | SUBROUTINE GAUSS(N, | ||
+ | DIMENSION C(N, | ||
+ | C | ||
+ | DO 10, | ||
+ | IBETTER=IMAIN | ||
+ | DO 101, | ||
+ | VALBETTER=ABS(C(IBETTER, | ||
+ | VALTRYME=ABS(C(ITRYME, | ||
+ | IF(VALBETTER.LT.VALTRYME)THEN | ||
+ | IBETTER=ITRYME | ||
+ | END IF !riga " | ||
+ | 101 CONTINUE | ||
+ | C | ||
+ | C | ||
+ | IF(IBETTER.NE.IMAIN)THEN | ||
+ | C !alla riga IMAIN. | ||
+ | DO 102, | ||
+ | TEMP=C(IMAIN, | ||
+ | C(IMAIN, | ||
+ | C(IBETTER, | ||
+ | 102 CONTINUE | ||
+ | TEMP=B(IMAIN) | ||
+ | B(IMAIN)=B(IBETTER) | ||
+ | B(IBETTER)=TEMP | ||
+ | END IF | ||
+ | C | ||
+ | DO 103, | ||
+ | RATIO=-C(ITRIANGLEME, | ||
+ | C(ITRIANGLEME, | ||
+ | DO 104, | ||
+ | C(ITRIANGLEME, | ||
+ | | ||
+ | 104 CONTINUE | ||
+ | B(ITRIANGLEME)=B(ITRIANGLEME)+RATIO*B(IMAIN) | ||
+ | 103 CONTINUE | ||
+ | 10 CONTINUE | ||
+ | C A questo punto la matrice dei coefficienti dovrebbe essere stata | ||
+ | C | ||
+ | C | ||
+ | C | ||
+ | C | ||
+ | V(N)=B(N)/ | ||
+ | C | ||
+ | DO 20, | ||
+ | SOMMA=0. | ||
+ | DO 202, | ||
+ | SOMMA=SOMMA+C(IEQNSCROLL, | ||
+ | 202 CONTINUE | ||
+ | V(IEQNSCROLL)=(B(IEQNSCROLL)-SOMMA)/ | ||
+ | 20 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | |||
+ | =====MAIN===== | ||
+ | |||
+ | |||
+ | |||
+ | C Postprocessor per calcolare le tensioni | ||
+ | | ||
+ | WRITE(2, | ||
+ | DO 30, | ||
+ | XI=XY(1, | ||
+ | YI=XY(2, | ||
+ | XJ=XY(1, | ||
+ | YJ=XY(2, | ||
+ | XK=XY(1, | ||
+ | YK=XY(2, | ||
+ | CALL BMAT(XI, | ||
+ | CALL PRODMAT(3, | ||
+ | DELTAEL(1)=UV(2*NVERT(1, | ||
+ | DELTAEL(2)=UV(2*NVERT(1, | ||
+ | DELTAEL(3)=UV(2*NVERT(2, | ||
+ | DELTAEL(4)=UV(2*NVERT(2, | ||
+ | DELTAEL(5)=UV(2*NVERT(3, | ||
+ | DELTAEL(6)=UV(2*NVERT(3, | ||
+ | CALL PRODMAT(3, | ||
+ | | ||
+ | ====Subroutine Bmat==== | ||
+ | |||
+ | Costruzione della matrice B di collegamento tra gli spostamenti nodali e le deformazioni di ciascun elemento finito triangolare attraverso la formula: EPSILON = B * DELTA.\\ | ||
+ | Le coordinate nodali vengono prese, come di consueto, in verso antiorario.\\ | ||
+ | Infine, poiché i termini nulli, sempre nelle stesse posizioni, vengono gi
inizializzati a zero inizialmente, | ||
+ | |||
+ | SUBROUTINE BMAT(XI, | ||
+ | DIMENSION B(3,6) | ||
+ | AI=XJ*YK-XK*YJ | ||
+ | AJ=XK*YI-XI*YK | ||
+ | AK=XI*YJ-XJ*YI | ||
+ | BI=YJ-YK | ||
+ | BJ=YK-YI | ||
+ | BK=YI-YJ | ||
+ | CI=XK-XJ | ||
+ | CJ=XI-XK | ||
+ | CK=XJ-XI | ||
+ | B(1,1)=BI | ||
+ | B(1,2)=0. | ||
+ | B(1,3)=BJ | ||
+ | B(1,4)=0. | ||
+ | B(1,5)=BK | ||
+ | B(1,6)=0. | ||
+ | B(2,1)=0. | ||
+ | B(2,2)=CI | ||
+ | B(2,3)=0. | ||
+ | B(2,4)=CJ | ||
+ | B(2,5)=0. | ||
+ | B(2,6)=CK | ||
+ | B(3,1)=CI | ||
+ | B(3,2)=BI | ||
+ | B(3,3)=CJ | ||
+ | B(3,4)=BJ | ||
+ | B(3,5)=CK | ||
+ | B(3,6)=BK | ||
+ | TWODEL=AI+AJ+AK | ||
+ | DO 10,I10=1,3 | ||
+ | DO 20,I20=1,6 | ||
+ | B(I10, | ||
+ | 20 CONTINUE | ||
+ | 10 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | ====Subroutine Prodmat==== | ||
+ | |||
+ | Esecuzione del prodotto AB di due matrici A e B. | ||
+ | |||
+ | SUBROUTINE PRODMAT(K1, | ||
+ | DIMENSION A(K1, | ||
+ | DO 10,I10=1,K1 | ||
+ | DO 30,I30=1,K3 | ||
+ | AB(I10, | ||
+ | DO 20,I20=1,K2 | ||
+ | AB(I10, | ||
+ | 20 CONTINUE | ||
+ | 30 CONTINUE | ||
+ | 10 CONTINUE | ||
+ | RETURN | ||
+ | END | ||
+ | | ||
+ | Nota: date due matrici quadrate di ordine " | ||
+ | |||
+ | =====MAIN===== | ||
+ | |||
+ | |||
+ | |||
+ | C Calcolo della tensione ideale secondo von Mises (solo in pstress) | ||
+ | SIGID1=SQRT(SIGMAEL(1)**2+SIGMAEL(2)**2-SIGMAEL(1)*SIGMAEL(2)+ | ||
+ | $3.*SIGMAEL(3)**2) | ||
+ | WRITE(2, | ||
+ | $' | ||
+ | 30 CONTINUE | ||
+ | STOP | ||
+ | END |