F90: Programa do momento

From AdonaiMedrado.Pro.Br
Jump to: navigation, search

Este programa foi desenvolvido pelos alunos Pedro Moreira e Raimundo Cunha durante a disciplina Processamento de Dados (UFBA 2008.2). Data da apresentação: 02/12/2008.

Este programa calcula o momento ou torque de “n” forças em relação a um eixo qualquer no espaço utilizando as coordenadas (x,y,z).

PROGRAM momento
  IMPLICIT NONE
  REAL :: TR=0
  REAL, DIMENSION(:,:,:), ALLOCATABLE :: M
  REAL, DIMENSION(:),ALLOCATABLE :: TORQUE
  INTEGER:: i,j,N,Z,OPCAO,ERRO=0
  WRITE(*,*) "CALCULA O MOMENTO DE UMA FORCA EM REALACAO A UM EIXO"
  WRITE(*,*) "QUAL UNIDADE VOCE DESEJA TRABALHAR"
  WRITE(*,*) "DIGITE 1 PARA TRABALHAR COM NEWTON*METRO"
  WRITE(*,*) "DIGITE 2 PARA TRABALHAR COM LIBRAFORCA*PE"
  WRITE(*,*) "PRECIONE QUALQUER TECLA PARA SAIR"
  READ(*,*,IOSTAT=ERRO) OPCAO
  IF (ERRO<=0) THEN
  SELECT CASE (OPCAO)
    CASE(1)
      WRITE(*,*) "DIGITE O NUMERO N DE FORCAS"
      DO
        READ(*,*,IOSTAT=ERRO) N
        IF (ERRO>0) THEN
          WRITE(*,*) "DIGITE UM NUMERO INTEIRO"
        ELSE 
          EXIT
        END IF
      END DO
      ALLOCATE (M(1:N,1:3,1:3))
      ALLOCATE (TORQUE(1:N))  
      WRITE(*,*) "DIGITE AS COORDENADAS DO EIXO"
      DO   
        READ(*,*,IOSTAT=ERRO) (M(1,1,j), j=1,3)
        IF (ERRO>0) THEN
          WRITE(*,*) "COODENEDAS INCORRETAS"
        ELSE 
          EXIT
        END IF
      END DO
      DO Z=1,N  
        WRITE(*,"(A,I2,A10)") "DIGITE AS COORDENADAS DO PONTO DE APLICACAO DA FORCA",Z,"EM METROS"     
        DO
          READ(*,*,IOSTAT=ERRO) (M(Z,2,j), j=1,3)
          IF (ERRO>0) THEN
            WRITE(*,*) "COODENEDAS INCORRETAS"
          ELSE 
            EXIT
          END IF
        END DO
        WRITE(*,"(A,I2,A10)") "DIGITE O VETOR FORCA",Z,"EM NEWTON"
        DO
          READ(*,*,IOSTAT=ERRO) (M(Z,3,j),j=1,3)
          IF (ERRO>0) THEN
            WRITE(*,*) "COODENEDAS INCORRETAS"
          ELSE 
            EXIT
          END IF
        END DO 
      END DO
      WRITE(*,*) "AS MATRIZES SAO"
      DO Z=1,N  
        WRITE (*,"(/3(F10.2))") (M(1,1,j), j=1,3)
        DO i=2,3
          WRITE (*,"(3(F10.2))") (M(Z,i,j), j=1,3)
        END DO
      END DO
      DO Z=1,N
        TORQUE(Z)=M(1,1,1)*M(Z,2,2)*M(Z,3,3)+M(1,1,2)*M(Z,2,3)*&
                          M(Z,3,1)+M(1,1,3)*M(Z,2,1)*M(Z,3,2)-(M(Z,3,1)*M(Z,2,2)*&
                          M(1,1,3))-M(Z,3,2)*M(Z,2,3)*M(1,1,1)-(M(Z,3,3)*M(Z,2,1)*M(1,1,2))
        TR=TR+TORQUE(Z)
      END DO
      IF (TR>0) THEN
        WRITE(*,"(A,F10.2,A2)") "O TORQUE RESULTANTE EM NM E",TR
        WRITE(*,"(A,F10.2,A3)") "OU EM Lbf*ft",TR/1.36
        WRITE(*,*)"O CORPO GIRA NO SENTIDO ANTI-HORARIO"
      ELSE IF (TR<0) THEN
        WRITE(*,"(A,F10.2,A2)") "O TORQUE RESULTANTE EM NM E",TR
        WRITE(*,"(A,F10.2,A3)") "OU EM Lbf*ft",TR/1.36
        WRITE(*,*)"O CORPO GIRA NO SENTIDO HORARIO"
      ELSE
        WRITE(*,"(A,F5.2,A2)") "O TORQUE RESULTANTE EM NM E",TR
        WRITE(*,"(A,F5.2,A6)") "OU EM Lbf*ft",TR/1.36
        WRITE(*,*)"O CORPO NAO GIRA"
      END IF
      DEALLOCATE (M)
      DEALLOCATE (TORQUE)
    CASE (2)
      WRITE(*,*) "DIGITE O NUMERO N DE FORCAS"
      DO
        READ(*,*,IOSTAT=ERRO) N
        IF (ERRO>0) THEN
          WRITE(*,*) "DIGITE UM NUMERO INTEIRO"
        ELSE 
          EXIT
        END IF
      END DO
      ALLOCATE (M(1:N,1:3,1:3))
      ALLOCATE (TORQUE(1:N))  
      WRITE(*,*) "DIGITE AS COORDENADAS DO EIXO"
      DO
        READ(*,*,IOSTAT=ERRO) (M(1,1,j), j=1,3)
        IF (ERRO>0) THEN
          WRITE(*,*) "COODENEDAS INCORRETAS"
        ELSE 
          EXIT
        END IF
      END DO
      DO Z=1,N  
        WRITE(*,"(A,I2,A7)") "DIGITE AS COORDENADAS DO PONTO DE APLICACAO DA FORCA",Z,"EM PES"
        DO
          READ(*,*,IOSTAT=ERRO) (M(Z,2,j), j=1,3)
          IF (ERRO>0) THEN
          WRITE(*,*) "COODENEDAS INCORRETAS"
          ELSE 
          EXIT
          END IF
        END DO
        WRITE(*,"(A,I2,A9)") "DIGITE O VETOR FORCA",Z,"EM LIBRA"
        DO
          READ(*,*,IOSTAT=ERRO) (M(Z,3,j),j=1,3)
          IF (ERRO>0) THEN
            WRITE(*,*) "COODENEDAS INCORRETAS"
          ELSE 
            EXIT
          END IF
        END DO 
      END DO
      WRITE(*,*) "AS MATRIZES SAO"
      DO Z=1,N  
        WRITE (*,"(/3(F10.2))") (M(1,1,j), j=1,3)
        DO i=2,3
          WRITE (*,"(3(F10.2))") (M(Z,i,j), j=1,3)
        END DO
      END DO
      DO Z=1,N
        TORQUE(Z)=M(1,1,1)*M(Z,2,2)*M(Z,3,3)+M(1,1,2)*M(Z,2,3)*M(Z,3,1)+&
                          M(1,1,3)*M(Z,2,1)*M(Z,3,2)-(M(Z,3,1)*M(Z,2,2)*M(1,1,3))-&
                          M(Z,3,2)*M(Z,2,3)*M(1,1,1)-(M(Z,3,3)*M(Z,2,1)*M(1,1,2))
        TR=TR+TORQUE(Z)
      END DO
      IF (TR>0) THEN
        WRITE(*,"(A,F10.2,A2)") "O TORQUE RESULTANTE EM Lbf*ft E",TR 
        WRITE(*,"(A,F10.2,A3)") "OU EM N*M",TR*1.36
        WRITE(*,*)"O CORPO GIRA NO SENTIDO ANTI-HORARIO"
      ELSE IF (TR<0) THEN
        WRITE(*,"(A,F10.2,A2)") "O TORQUE RESULTANTE EM Lbf*ft E",TR
        WRITE(*,"(A,F10.2,A3)") "OU EM N*M",TR*1.36
        WRITE(*,*)"O CORPO GIRA NO SENTIDO HORARIO"
      ELSE
        WRITE(*,"(A,F5.2,A6)") "O TORQUE RESULTANTE EM Lbf*ft E",TR
        WRITE(*,"(A,F5.2,A3)") "OU EM N*M",TR*1.36
        WRITE(*,*)"O CORPO NAO GIRA"
      END IF
      DEALLOCATE (M)
      DEALLOCATE (TORQUE)
    END SELECT
  END IF
END PROGRAM momento