Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Fortran] Blocco durante esecuzione

    Ciao a tutti.

    Non sono un esperto ma ho sempre usato fortran77 per fare codici di calcolo ed evitarmi lavoro.
    Al momento sono alle prese con un codice che legge 12733 coppie di dati...ogni coppia è l'input per l'identificazione di alcuni riferimenti che vengono interpolati per ottenere un valore legato appunto a quella coppia.

    La compilazione non da problemi ma durante l'esecuzione si blocca...il file di output è scritto ed i dati corrispondono, ma ad un certo punto la scrittura viene interrotta (addirittura l'ultimo dato scritto è incolpleto).

    Di solito uso Force come compilatore. Ho provato ad usare Silverfrost e mi si blocca ugualmente (anche se ad una punto leggermente diverso). Silverfrost mi da Runtime Error dicendo che c'è un Floating Point co-processor fault non so cosa sia.

    Quì di seguito metto il codice in una versione semplificata che lavora senza subroutine e con un solo file di input (si blocca comunque ma evita di postarvi inutili reiterazioni di subroutine che uso per fare calcoli su più fronti):

    codice:
          program giro_forze
          
          implicit none
    
          integer i, j
          
          double precision acc(12733), ang(12733)
          double precision acci, angi
          double precision mod, theta
          double precision r(921,5)
          double precision mod1, mod2, mod3, mod4
          double precision x1, x2, x3, x4
          double precision y1, y2, y3, y4
          double precision z1, z2, z3, z4
          double precision theta1, theta2
          double precision xm1, xm2
          double precision ym1, ym2
          double precision zm1, zm2
          double precision x, y, z
          
          open(21,file='01 - Dati Giro.txt',status='old')
          
            read(21,*)
            do i=1,12733
              read(21,*)acc(i),ang(i)
            end do
    
          open(22,file='02 - rette carico ant 04.txt',status='old')
          
            do i=1,921
              read(22,*)(r(i,j),j=1,5)
            end do
    
          open(23,file='04 - ciclo carico ant 04.txt',status='unknown')
    
    23    format(1x,i8,3(f12.3,3x))
          
          do i=1,12733
          
            acci=acc(i)
            angi=ang(i)
            
            if (angi.lt.0.0d+00) then
              theta=angi+1.8d+00
              mod=-acci
            else
              theta=angi
              mod=acci
            end if
            
            j=1
    
    100     continue
            if ((r(j,1).le.theta).and.((r(j,1)+5.0d+00).gt.theta)) then
              if  ((r(j,2).le.mod).and.(r(j+1,2).gt.mod)) then
                x1=r(j,3)
                x2=r(j+1,3)
                y1=r(j,4)
                y2=r(j+1,4)
                z1=r(j,5)
                z2=r(j+1,5)
                mod1=r(j,2)
                mod2=r(j+1,2)
                theta1=r(j,1)
              else
                j=j+1
                go to 100
              end if
            else
              j=j+1
              go to 100
            end if
            
            j=24
    
    200     continue
            if (((r(j,1)-5.0d+00).le.theta).and.(r(j,1).gt.theta)) then
              if  ((r(j,2).le.mod).and.(r(j+1,2).gt.mod)) then
                x3=r(j,3)
                x4=r(j+1,3)
                y3=r(j,4)
                y4=r(j+1,4)
                z3=r(j,5)
                z4=r(j+1,5)
                mod3=r(j,2)
                mod4=r(j+1,2)
                theta2=r(j,1)
              else
                j=j+1
                go to 200
              end if
            else
              j=j+1
              go to 200
            end if
    
            xm1=x1+(x2-x1)/(mod2-mod1)*(mod-mod1)
            xm2=x3+(x4-x3)/(mod4-mod3)*(mod-mod3)
            x=xm1+(xm2-xm1)/(theta2-theta1)*(theta-theta1)
            
            ym1=y1+(y2-y1)/(mod2-mod1)*(mod-mod1)
            ym2=y3+(y4-y3)/(mod4-mod3)*(mod-mod3)
            y=ym1+(ym2-ym1)/(theta2-theta1)*(theta-theta1)
            
            zm1=z1+(z2-z1)/(mod2-mod1)*(mod-mod1)
            zm2=z3+(z4-z3)/(mod4-mod3)*(mod-mod3)
            z=zm1+(zm2-zm1)/(theta2-theta1)*(theta-theta1)
    
            write(23,23)i,x,y,z
    
          end do
    
          close(21)
          close(22)
          close(23)
    
          stop
          end
    In questa versione il file smette di essere stampato per i=551, mentre nella versione con subroutine (che ha molti più file di input, output e continui richiami di 3 subroutine) tutti i file di output si bloccano ad i=372. La riga di output 552 (o 373) riportano un valore troncato oltre il quale non avviene più la stampa dei dati.

    Cos'è che non funziona?? Lavoro in Win7...ho anche già provato a modificare la compatibilità dell'.exe creato per WinXPsp3 ed esecuzione come amministratore (non si sa mai) ma non funzia. Specifico inoltre che con altre decine di codici non ho mai avuto problemi...

    Grazie a chiunque mi voglia rispondere!

  2. #2
    Tento un uppino, aggiungendo che nel frattempo provo a riscrivere il codice memorizzando gli input in vettori di dimensioni diverse per limitare le if, che sono tantissime così come l'ho postato...non avevo voglia di mettermi ad ottimizzare il fuzionamento...

  3. #3
    RISOLTO

    non so esattamente come ma ho letto i dati di input con un vettore tridimensionale che divideva in blocchi il vettore bidimensionale. Questo ha permesso di togliere una if che veniva reiterata con un go to . I cicli si sono limitati molto perchè dovevo cercare una variabile in meno (che ora è identificata dall'indice a ). Non so se il problema fosse in qualche modo collegato a questo, ma ora funzia.

    Posto pro-forma il codice:

    codice:
          program giro_forze
          
          implicit none
    
          integer i, j, k
          integer a
          
          double precision acc(12733), ang(12733)
          double precision acci, angi
          double precision mod, theta
          double precision r(37,25,5)
          double precision mod1, mod2, mod3, mod4
          double precision x1, x2, x3, x4
          double precision y1, y2, y3, y4
          double precision z1, z2, z3, z4
          double precision theta1, theta2
          double precision xm1, xm2
          double precision ym1, ym2
          double precision zm1, zm2
          double precision x, y, z
          
          open(21,file='01 - Dati Giro.txt',status='old')
          
            read(21,*)
            do i=1,12733
              read(21,*)acc(i),ang(i)
            end do
    
          open(22,file='02 - rette carico post 01.txt',status='old')
    
            read(22,*)(r(1,1,k),k=1,5)
            do k=1,5
              r(1,2,k)=r(1,1,k)
              r(1,3,k)=r(1,1,k)
            end do
            do j=4,25
              read(22,*)(r(1,j,k),k=1,5)
            end do
            do i=2,36
              do j=1,25
                read(22,*)(r(i,j,k),k=1,5)
              end do
            end do
            read(22,*)(r(37,1,k),k=1,5)
            do k=1,5
              r(37,2,k)=r(37,1,k)
              r(37,3,k)=r(37,1,k)
            end do
            do j=4,25
              read(22,*)(r(37,j,k),k=1,5)
            end do
    
          open(23,file='04 - ciclo carico post 01.txt',status='unknown')
    
    23    format(1x,i8,7(3x,f12.3))
          
          do i=1,12733
          
            acci=acc(i)
            angi=ang(i)
            
            if (angi.lt.0.0d+00) then
              theta=angi+1.8d+02
              mod=-acci
            else
              theta=angi
              mod=acci
            end if
    
            a=theta/5
            a=a+1
            
            j=1
            
    100     continue
            if ((r(a,j,2).le.mod).and.(r(a,j+1,2).gt.mod)) then
              x1=r(a,j,3)
              x2=r(a,j+1,3)
              y1=r(a,j,4)
              y2=r(a,j+1,4)
              z1=r(a,j,5)
              z2=r(a,j+1,5)
              mod1=r(a,j,2)
              mod2=r(a,j+1,2)
              theta1=r(a,j,1)
            else
              j=j+1
              go to 100
            end if
            
            j=1
            
    200     continue
            if ((r(a+1,j,2).le.mod).and.(r(a+1,j+1,2).gt.mod)) then
              x3=r(a+1,j,3)
              x4=r(a+1,j+1,3)
              y3=r(a+1,j,4)
              y4=r(a+1,j+1,4)
              z3=r(a+1,j,5)
              z4=r(a+1,j+1,5)
              mod3=r(a+1,j,2)
              mod4=r(a+1,j+1,2)
              theta2=r(a+1,j,1)
            else
              j=j+1
              go to 200
            end if
    
            xm1=x1+(x2-x1)/(mod2-mod1)*(mod-mod1)
            xm2=x3+(x4-x3)/(mod4-mod3)*(mod-mod3)
            x=xm1+(xm2-xm1)/(theta2-theta1)*(theta-theta1)
            
            ym1=y1+(y2-y1)/(mod2-mod1)*(mod-mod1)
            ym2=y3+(y4-y3)/(mod4-mod3)*(mod-mod3)
            y=ym1+(ym2-ym1)/(theta2-theta1)*(theta-theta1)
            
            zm1=z1+(z2-z1)/(mod2-mod1)*(mod-mod1)
            zm2=z3+(z4-z3)/(mod4-mod3)*(mod-mod3)
            z=zm1+(zm2-zm1)/(theta2-theta1)*(theta-theta1)
    
            write(23,23)i,x,y,z
    
          end do
    
          close(21)
          close(22)
          close(23)
    
          stop
          end

  4. #4
    Tuttavia il dubbio mi rimane...non capisco quale formalità sia che non permetteva la stampa dei dati. Qualcuno sa se i compilatori di fortran (2 ne ho provati e 2 davano errore) hanno qualche sicurezza, qualche cosa, che possa bloccare forzatamente il progredire dell'esecuzione? O può essere un'incompatibilità con qualcosa del sistema operativo? Ho un Dell XPS 15 con Win7...mai formattato per ora, quindi tutto originale.

    Ci sono ipotesi di qualche genere?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.