wikipaom2015:lez08
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:lez08 [2015/03/14 15:21] – 202734 | wikipaom2015:lez08 [2015/06/25 07:51] (versione attuale) – [Vincolamento di una matrice di Rigidezza] 163359 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | {{: | ||
+ | |||
+ | ==== Costruzione di una Matrice/ | ||
+ | In questa prova, si fa uso di una struttura chiamata **Array** (dall' | ||
+ | Gli " | ||
+ | Possono essere, ad esempio, del tipo: | ||
+ | === real a(20) === | ||
+ | dove si dichiara un vettore ad elementi reali di 20 elementi allocati nella memoria a 32 bit uno dietro l' | ||
+ | |||
+ | Di seguito, è riportato il programma che costruisce una matrice o un vettore, basato sull' | ||
+ | Va ricordato, che il nome del programma può coincidere o meno con il nome del file senza che questo influisca sull' | ||
+ | |||
+ | Inizializzo le colonne utilizzabili su Fortran77 (72 colonne) in questa maniera: | ||
+ | |||
+ | c234567================================================================| | ||
+ | |||
+ | Definisco il nome del programma | ||
+ | program tmat | ||
+ | Inserisco un **implicit none** in modo da dover esplicitare completamente tutte le variabili evitando di cadere in errori di programmazione | ||
+ | | ||
+ | |||
+ | Definisco due costanti nrow, ncol e dichiaro (alloco) matrice A | ||
+ | | ||
+ | | ||
+ | real A(nrow, | ||
+ | |||
+ | Definisco due indici | ||
+ | | ||
+ | |||
+ | Fine Dichiarazioni ed Inizio Istruzioni | ||
+ | |||
+ | INPUT matrice A da standard input (stdin) | ||
+ | |||
+ | do irow = 1,nrow | ||
+ | | ||
+ | |||
+ | Adesso dobbiamo scegliere tra due alternative di utilizzo del ciclo do | ||
+ | |||
+ | do interno al read | ||
+ | | ||
+ | |||
+ | do esterno al read | ||
+ | do icol = 1 , ncol | ||
+ | | ||
+ | | ||
+ | enddo | ||
+ | enddo | ||
+ | |||
+ | OUTPUT matrice A su stdout | ||
+ | do irow = 1,nrow | ||
+ | write(*,*) ' | ||
+ | |||
+ | Adesso in base alla scelta fatta in input bisogna in maniera coerente scegliere il tipo di ciclo do in output | ||
+ | |||
+ | do interno al write | ||
+ | write(*,*) ( A(irow, | ||
+ | |||
+ | do esterno al write | ||
+ | do icol = 1 , ncol | ||
+ | | ||
+ | enddo | ||
+ | | ||
+ | |||
+ | stop | ||
+ | end | ||
+ | |||
+ | NOTA BENE: questo programma consente la costruzione della matrice immettendo gli elementi da tastiera uno alla volta (Metodo scomodo) | ||
+ | |||
+ | |||
+ | ==== Prodotto Matrice/ | ||
+ | Di seguito, è riportato un metodo di costruzione della matrice, che assegna gli elementi leggendo in automatico un file .txt in cui sono già stati elencati i valori degli elementi desiderati. | ||
+ | Tale programma inoltre serve a eseguire il prodotto tra matrici/ | ||
+ | |||
+ | $$\begin{vmatrix}a_{1, | ||
+ | |||
+ | L' | ||
+ | |||
+ | $$ C_{irow, | ||
+ | |||
+ | Definisco il nome del programma | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | Definisco due costanti nrow, ncol e dichiaro (alloco) le matrici A B C | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | real A(nArow, | ||
+ | real B(nBrow, | ||
+ | real C(nCrow, | ||
+ | |||
+ | Definisco due indici per scorrere le matrici, più uno di sommatoria | ||
+ | | ||
+ | |||
+ | Fine Dichiarazioni ed Inizio Istruzioni | ||
+ | |||
+ | |||
+ | INPUT matrice A da standard input (stdin) | ||
+ | do irow = 1,nArow | ||
+ | read(*,*) ( A(irow, | ||
+ | enddo | ||
+ | |||
+ | INPUT matrice B da standard input (stdin) | ||
+ | do irow = 1,nBrow | ||
+ | read(*,*) ( B(irow, | ||
+ | enddo | ||
+ | Inizio CALCOLO DEL PRODOTTO | ||
+ | |||
+ | call prodmat(nArow, | ||
+ | |||
+ | Fine CALCOLO DEL PRODOTTO | ||
+ | |||
+ | OUTPUT matrice C su stdout | ||
+ | do irow = 1,nCrow | ||
+ | write(*,*) ( C(irow, | ||
+ | | ||
+ | |||
+ | stop | ||
+ | end | ||
+ | |||
+ | Adesso creo un sottoprogramma ' | ||
+ | |||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | INPUT | ||
+ | Dimensionamento matrici per prodotto | ||
+ | | ||
+ | |||
+ | Datrici per prodotto | ||
+ | real AA( nAArow, nAAcol ) | ||
+ | real BB( nAAcol, nBBcol ) | ||
+ | |||
+ | OUTPUT | ||
+ | Matrice su cui scrivere il risultato del prodotto | ||
+ | real CC( nAArow, nBBcol ) | ||
+ | |||
+ | IN/OUT , UPDATE, MODIFICA | ||
+ | area dedicata a variabili a cui si accede in INPUT/ | ||
+ | |||
+ | VARIABILI LOCALI | ||
+ | Dichiaro gli indici di scorrimento riga/ | ||
+ | | ||
+ | |||
+ | Fine Dichiarazioni ed Inizio Istruzioni | ||
+ | |||
+ | do irow = 1,nAArow | ||
+ | do icol = 1, nBBcol | ||
+ | | ||
+ | do isum = 1, nAAcol | ||
+ | CC(irow, | ||
+ | enddo | ||
+ | enddo | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | Riga di comando per compilazione ed esecuzione: | ||
+ | |||
+ | ** gfortran tmat_v1.for | ||
+ | |||
+ | con la stringa **> output.txt** i risultati vengono sovrascritti sul file output.txt, mentre se avessi inserito **> > output.txt** i dati sarebbero stati accodati all' | ||
+ | |||
+ | Il file **input.txt** è così definito: | ||
+ | |||
+ | 1. | ||
+ | |||
+ | 6. | ||
+ | |||
+ | 11. 12. 13. 14. 15. | ||
+ | |||
+ | 0.1 0.2 | ||
+ | |||
+ | 0.3 0.4 | ||
+ | |||
+ | 0.5 0.6 | ||
+ | |||
+ | 0.7 0.8 | ||
+ | |||
+ | 0.9 1.0 | ||
+ | |||
+ | |||
+ | ==== Cos'è un Sottoprogramma (Subroutine)? | ||
+ | Il linguaggio di programmazione FORTRAN consente di suddividere le operazioni tramite sottoprogrammi che ritornano un risultato al programma chiamante, sviluppando un approccio top-down. L' | ||
+ | |||
+ | Creiamo adesso un sottoprogramma che determina il: | ||
+ | |||
+ | ==== Vincolamento di una matrice di Rigidezza | ||
+ | |||
+ | Si vuole vincolare la matrice di rigidezza della struttura STRUTK ai termini noti o forze applicate sulla struttura (FORCE) e agli spostamenti che in realtà sono incogniti. Così si opera direttamente con una subroutine: | ||
+ | |||
+ | | ||
+ | | ||
+ | INPUT | ||
+ | | ||
+ | | ||
+ | real V | ||
+ | INOUT | ||
+ | real STRUTK(N,N) | ||
+ | real FORCE(N) | ||
+ | LOCALI | ||
+ | | ||
+ | |||
+ | Fine Dichiarazioni ed Inizio Istruzioni | ||
+ | |||
+ | Affinché la matrice possa essere simmetrica e definita positiva, | ||
+ | do J = 1,N | ||
+ | STRUTK( I , J ) = 0.0 | ||
+ | enddo | ||
+ | |||
+ | ma si sa anche che l' | ||
+ | | ||
+ | |||
+ | Definisco il valore imposto V a termine noto, elemento I-esimo | ||
+ | | ||
+ | |||
+ | Ora bisogna recuperare la simmetria della matrice annullando i termini della i-esima colonna, perciò creo due blocchi di matrice che vanno da 1 a I-1 e da I+1 ad N | ||
+ | |||
+ | do J = 1 , I-1 | ||
+ | FORCE(J) = FORCE(J) - STRUTK(J,I) * V | ||
+ | STRUTK(J,I) = 0.0 | ||
+ | enddo | ||
+ | |||
+ | Salto caso J=I, legato alla diagonale che già era stato impostato in precedenza e si ottiene: | ||
+ | |||
+ | do J = I+1 , N | ||
+ | FORCE(J) = FORCE(J) - STRUTK(J,I) * V | ||
+ | STRUTK(J,I) = 0.0 | ||
+ | enddo | ||
+ | |||
+ | Basta chiudere la subroutine e il main e si ottiene il codice di vincolamento. | ||
+ | |||
+ | |||
+ | | ||
+ | end | ||
+ | |||
+ | |||
+ | ~~DISCUSSION|Note di redazione~~ |