module defpi implicit none real(8),parameter::pi=3.14159265358979323846D0 end module defpi program f90_ARSFFT !***************************************************************** !Acceleration Response Spectrum (frequency domain) !***************************************************************** use defpi implicit none integer::ndata,i,k,nnn real(8)::accmax,velmax,dismax !Maximum values real(8),allocatable::acc(:) !Acceleration real(8),allocatable::vel(:) !Velocity real(8),allocatable::dis(:) !Displacement real(8),allocatable::resacc(:) !Acceleration real(8),allocatable::resvel(:) !Velocity real(8),allocatable::resdis(:) !Displacement real(8),allocatable::Tk(:) !Natural period real(8)::hh !Damping factor real(8)::dt !Time increment character::fnameR*50,fnameW*50 !Input & output file name character::dummy*50,linebuff*300 nnn=200 hh=0.05 allocate(Tk(1:nnn)) allocate(resacc(1:nnn)) allocate(resvel(1:nnn)) allocate(resdis(1:nnn)) call getarg(1,fnameR) !Input file name (time history data of acceleration) call getarg(2,fnameW) !Output file name open(11,file=fnameR,status='old') read(11,'(a)') linebuff read(11,*) dummy,dt read(11,*) dummy,ndata allocate(acc(1:ndata)) allocate(vel(1:ndata)) allocate(dis(1:ndata)) do i=1,ndata read(11,*) acc(i) end do close(11) do k=1,nnn Tk(k)=10.0D0**(log10(2.0*dt)+(log10(10.0)-log10(2.0*dt))/dble(nnn)*dble(k-1)) end do call IACC(ndata,dt,acc,vel,dis,accmax,velmax,dismax) !Integral of acceleration call CRAC(ndata,dt,acc,vel,dis,accmax,velmax,dismax) !Amendment of base line call CALRES(ndata,nnn,dt,hh,acc,Tk,resacc,resvel,resdis) !Calculation of response open (12, file=fnameW, status='replace') write(12,'(a)') trim(linebuff) write(linebuff,*) 'nt,',nnn call del_spaces(linebuff) write(12,'(a)') trim(linebuff) write(12,'(a)') 'period(sec),acc(gal),vel(kine),dis(cm)' do k=1,nnn write(linebuff,*) Tk(k),',',resacc(k),',',resvel(k),',',resdis(k) call del_spaces(linebuff) write(12,'(a)') trim(linebuff) end do close(12) stop contains subroutine CALRES(ndata,nnn,dt,hh,accinp,Tk,resacc,resvel,resdis) integer,intent(in)::ndata,nnn real(8),intent(in)::dt,hh real(8),intent(in)::accinp(1:ndata),Tk(1:nnn) real(8),intent(out)::resacc(1:nnn),resvel(1:nnn),resdis(1:nnn) integer::i,k real(8)::w0,acmax,vemax,dimax real(8)::acc(1:ndata),vel(1:ndata),dis(1:ndata) do k=1,nnn w0=2.0D0*pi/Tk(k) call ARSFFT(ndata,accinp,dt,hh,w0,acc,vel,dis) acmax=0.0D0 vemax=0.0D0 dimax=0.0D0 do i=1,ndata if(acmax=k) j=j-k k=k/2 if(k==0)exit end do j=j+k end do end subroutine FFT subroutine IACC(nn,dt,acc,vel,dis,accmax,velmax,dismax) !***************************************************************** !Integral of acceleration !***************************************************************** !nn : Number of time history data of acceleration !dt : Time increment (input data) !acc() : Time history data of Acceleration (input data) !vel() : Time history data of Velocity (output data) !dis() : Time history data of Displacement (output data) !accmax: Maximum value of acceleration (output data) !velmax: Maximum value of velocity (output data) !dismax: Maximum value of displacement (output data) integer,intent(in)::nn real(8),intent(in)::dt real(8),intent(in)::acc(1:nn) real(8),intent(out)::vel(1:nn),dis(1:nn) real(8),intent(out)::accmax,velmax,dismax integer::i accmax=0.0 velmax=0.0 dismax=0.0 vel(1)=0.0 dis(1)=0.0 do i=2,nn vel(i)=vel(i-1)+(acc(i-1)+acc(i))*dt/2.0D0 dis(i)=dis(i-1)+vel(i-1)*dt+(acc(i-1)/3.0D0+acc(i)/6.0D0)*dt*dt if(accmax