#!/bin/ksh 
#
#  ww3_spec2vartotal_asc.scpt
#
#         objetivo: 
#                  tomar espectro saida do ww3 do arquivo *.spc e 
#                  obter as principais variaveis totais do espectro (HS,DIRH,PER,DIRPER,PPICO e DPICO)
#
#         sintaxe : 
#                  ww3_spec_asc2bin.scpt <nome do arquivo>
#                  ww3_spec_asc2bin.scpt d-glo_2X/200803/WW3_2008033100_brasil_spc_lst
#         ---------------------------------------------------------------
#
#                  WRITE (NDSTAB) 'WAVEWATCH III SPECTRA',           &
#                         NK, NTH, NREQ, GNAME
# 
# 
#                  WRITE (NDSTAB) (SIG(IK)*TPIINV,IK=1,NK)
#                  WRITE (NDSTAB) (MOD(2.5*PI-TH(ITH),TPI),ITH=1,NTH)
# 
#             DO 310, IK=1, NK        !frequencias
#             DO 320, ITH=1, NTH      !direcoes
#                ISP=ITH+(IK-1)*NTH
#!               E(IK,ITH) = SPCO(ISP,J)  ! por frequencia
#                E(IK,ITH) = SPCO(ISP,J) ! por periodo
#  320           CONTINUE
#  310           CONTINUE
# 
# 
#      WRITE(NDSTAB,1200) ((E(IK,ITH),IK=1,NK),ITH=1, NTH)
# 
#1200  FORMAT(7E11.3)
#      ENDIF
#  700           CONTINUE

     data=${1}00
     file_in=/scratchout/grupos/oceano/home/rosio.camayo/ondas_io.v2/WW3/d-cases/d-global2/d-results/${data}/WW3_${data}.spc_1
     file_out1=/scratchout/grupos/oceano/home/rosio.camayo/validation/validate_pesq/d-input/d-ww3/ww3_points_freq_${data}
     file_out2=/scratchout/grupos/oceano/home/rosio.camayo/validation/validate_pesq/d-input/d-ww3/ww3_points_dir_${data}

     a=$(grep 'WAVEWATCH III SPECTRA' $file_in )
    
     [ -z $a ] && echo " file $file_in nao eh um arquivo espectro wwatch" && exit


      head -1 $file_in | cut -d"'" -f3 | read  ndir nfre npto

     echo  $ndir 
     echo  $nfre
     echo  $npto

     njump=0

     echo " ********** pula no tempo ******************"
     echo "            faz um pula $njump               "
     echo " ********** ************* ******************"


 cat <<EOF> calc_vartotal.f90

    REAL, DIMENSION ( $nfre )    :: FRE , PER, EFRE
    REAL, DIMENSION ( $ndir )    :: DIR , DEG, EDIR
    REAL, DIMENSION ( $nfre , $ndir )    ::  E
    REAL, DIMENSION ( $ndir )    ::  X_AUX
    REAL :: PI , TWO_PI
    CHARACTER (LEN=50)  :: CHA_50
    CHARACTER (LEN=500) :: CHA_500

    PI = ATAN(1.)*4
    TWO_PI = ATAN(1.)*8.

    OPEN(13,FILE='$file_in ', STATUS='UNKNOWN', FORM='FORMATTED' )
    OPEN(80,FILE='$file_out1 ', STATUS='UNKNOWN', FORM='FORMATTED' )
    OPEN(90,FILE='$file_out2 ', STATUS='UNKNOWN', FORM='FORMATTED' )

    READ(13,*)

    READ(13,*)( FRE(IFR) , IFR = 1 , $nfre )  ! Frequencia em Hz
    READ(13,*)( DIR(IDI) , IDI = 1 , $ndir)   ! Direcoes em rad

! Nao vamos precisar converter para periodo, porque precisamos
! calcular H com as frequencias
    
!    PER(:) = 1./FRE(:)
!    DO IFR = 1 , $nfre/2
!       IFR_I = $nfre - IFR + 1
!       X = PER(IFR)
!       PER(IFR) =  PER(IFR_I)
!       PER(IFR_I) = X     ! Periodo em s
!    ENDDO


    DO IDI = 1 ,  ${ndir}
           TETA = 2.5*PI - DIR(IDI)
           DEG(IDI) = MOD( TETA , 2.*PI )
    ENDDO

    DO IDI = 1 ,  ${ndir} 
        R1 = 360.*DEG(IDI)/TWO_PI
        I1 = NINT( R1  )
        DEG(IDI) = FLOAT(I1)  ! Direcoes em graus
    ENDDO

    NCONT = 0
    NTIME = 0

    500 READ(13,'(A50)',IOSTAT=IFF) CHA_50

        IF(IFF.NE.0) GO TO 600

          WRITE(*,*)'======================== '
          WRITE(*  , '(A)' ) TRIM(CHA_50)
         
          NTIME = NTIME + 1
          NRES = MOD ( NTIME , (1+${njump}) )
          
          NIFF = 0

          IF(${njump}.EQ.0) NIFF = 1

          IF(NRES.EQ.1)NIFF=1

!         IF (NIFF.EQ.1)  WRITE(52 , '(A)' ) TRIM(CHA_50)

          DO IP = 1 , ${npto}

             READ(13,'(A500)') CHA_500
             ! WRITE(*, '(A)' ) TRIM(CHA_500)
!             IF(NCONT.LT.${npto}) WRITE(53,'(A)') TRIM(CHA_500)

             READ(13,*)( ( E(IF , ID ) , IF=1,${nfre} ),ID=1,${ndir})

! Nao precisa inverter a matriz da energia(E) porque estamos usando as frequencias
! precisaria se estivesemos usando periodos
!             DO IF = 1 , ${nfre}/2
!                    IFT = ${nfre} - IF + 1
 
!                    X_AUX(:)   =  E(IFT , :) 
!                    E(IFT , :) =  E(IF , :) 
!                    E(IF , :)  =  X_AUX(:)     
!             ENDDO
 
! I. CALCULO DA ALTURA DA ONDA SIGNIFICATIVA (HSIG_D ou HSIG_F)  
!
!    Input: DEG (graus), FRE (Hz) e E 
!    
         CALL POR_DIR ( DEG , FRE , E , EFRE , EDIR , HSIG_D , HSIG_F )


         WRITE(80, ' (A,1X,A15,F5.2)' ) TRIM(CHA_50),TRIM(CHA_500),HSIG_F 
         WRITE(90, ' (A,1X,A15,F5.2)' )  TRIM(CHA_50),TRIM(CHA_500),HSIG_D 

          ENDDO  

          GO TO 500 

    600 CONTINUE
END

!   ===========================================================

    SUBROUTINE POR_DIR ( DIR , FRE , E , EFRE , EDIR , HSIG_D, HSIG_F)

          PARAMETER(NDIR=${ndir},        NFRE=${nfre} )
          REAL, DIMENSION  (NFRE,NDIR)  :: E 
          REAL                          :: PI
          REAL, DIMENSION  (NDIR)       :: DIR , EDIR , DIR_RAD
          REAL, DIMENSION  (NFRE)       :: FRE , EFRE 
          REAL, DIMENSION  (NFRE)       :: SIG , DSII
! ---
          PI = ATAN(1.)*4.
          TPI = (2.*PI)
          TPIINV = 1./TPI


! ---  defining


          FRE_FAC =   FRE(2)/FRE(1)
          DEL_DIR = ( DIR(2) - DIR(1) )*PI/180.


          DO I_NF = 1 , NFRE
             SIG (I_NF) = FRE(I_NF)*TPI
          END DO
           
          DSII( 1) = 0.5 * SIG( 1) * (FRE_FAC-1.)
          DO  I_NF=2, NFRE-1
              DSII(I_NF) = SIG (I_NF) * 0.5 * (FRE_FAC-1./FRE_FAC)
          END DO


          DSII(NFRE) = 0.5 * SIG(NFRE) * (FRE_FAC-1.) / FRE_FAC

  
! --- computing by frequency

          ET     = 0.
          DO 390 I_NF = 1, NFRE

              EBND   = SUM ( E(I_NF,:) )

              EFRE(I_NF) = EBND * DEL_DIR

              ET     = ET  + EFRE(I_NF) * DSII(I_NF) * TPIINV

  390     CONTINUE

!
! tail factors for radian action etc ...!
!
!

             ET     = ET  + EFRE(NFRE) * TPIINV * 0.25 * SIG(NFRE)

             HSIG_F  = 4. * SQRT ( ET )


! --- computing by direction

          ET     = 0.
          DO 490 I_ND = 1, NDIR

              EBND   = SUM ( E(:,I_ND)* DSII(:) ) * TPIINV

! tail factors for radian action etc ...!

              EDIR(I_ND) = EBND + E(NFRE,I_ND) * TPIINV * 0.25 * SIG(NFRE)

              ET     = ET  + EDIR(I_ND) * DEL_DIR

  490     CONTINUE

          HSIG_D  = 4. * SQRT ( ET )

END

EOF

    ftn -o  calc_vartotal  calc_vartotal.f90

    ./calc_vartotal

#    \mv -f fort.50 fre_lst
#    \mv -f fort.51 dir_lst
#    \mv -f fort.52 datas_lst
#    \mv -f fort.53 ptos_lst
    \rm calc_vartotal  calc_vartotal.f90



exit
exit


