⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sprfft.f

📁 Fortran的数学物理方程数值算法源程序。这是"Numerical Methods for Physics"第二版的Fortran源程序
💻 F
字号:
! sprfft - Program to compute the power spectrum of a! coupled mass-spring system.      program sprfft      integer*4 MAXnStep      parameter( MAXnStep = 100000 )      integer*4 nState, i, iStep, nStep, nPrint      real*8 x(3), v(3), state(6), param(1)      real*8 time, tau, pi, k_over_m, window      real*8 xplot(MAXnStep,3), tplot(MAXnStep)      real*8 f(MAXnStep), spect(MAXnStep), spectW(MAXnStep)      complex*16 x1fft(MAXnStep), x1fftW(MAXnStep)      external sprrk      !* Set parameters for the system (initial positions, etc.).      nState = 6      write(*,*) 'Enter initial displacements x(1),x(2),x(3) = '      read(*,*) x(1), x(2), x(3)      v(1) = 0.0      v(2) = 0.0    ! Masses are initially at rest      v(3) = 0.0      state(1) = x(1)      state(2) = x(2)      state(3) = x(3)      state(4) = v(1)      state(5) = v(2)      state(6) = v(3)      write(*,*) 'Enter timestep: '      read(*,*) tau      k_over_m = 1      ! Ratio of spring const. over mass      param(1) = k_over_m      !* Loop over the desired number of time steps.      time = 0          ! Set initial time      nStep = 256       ! Number of steps in the main loop      nPrint = nStep/8  ! Number of steps between printing progress      do iStep=1,nStep        !* Use Runge-Kutta to find new displacements of the masses.        call rk4(state,nState,time,tau,sprrk,param)        time = time + tau        !* Record the positions for graphing and to compute spectra.        xplot(iStep,1) = state(1)   ! Record positions        xplot(iStep,2) = state(2)        xplot(iStep,3) = state(3)        tplot(iStep) = time        if( mod(iStep,nprint) .lt. 1 ) then          write(*,*) 'Finished ', iStep, ' out of ', nStep, ' steps'        endif      enddo      !* Calculate the power spectrum of the time series for mass #1      do i=1,nStep        f(i) = (i-1)/(tau*nStep)      ! Frequency        x1fft(i) = xplot(i,1)         ! Displacement of mass 1      enddo      call fft(x1fft, nStep)       ! Fourier transform of displacement      do i=1,nStep                 ! Power spectrum of displacement        spect(i) = abs(x1fft(i))**2      enddo      !* Apply the Hanning window to the time series and calculate      !  the resulting power spectrum      pi = 3.141592654      do i=1,nStep        window = 0.5*(1.0-cos(2.0*pi*(i-1.0)/nStep))  ! Hanning window        x1fftW(i) = xplot(i,1) * window               ! Windowed time series      enddo      call fft(x1fftW, nStep)      ! Fourier transf. (windowed data)      do i=1,nStep                 ! Power spectrum (windowed data)        spectW(i) = abs(x1fftW(i))**2      enddo      !* Print out the plotting variables:      !    tplot, xplot, f, spect, spectw      open(11,file='tplot.txt',status='unknown')      open(12,file='xplot.txt',status='unknown')      open(13,file='f.txt',status='unknown')      open(14,file='spect.txt',status='unknown')      open(15,file='spectw.txt',status='unknown')      do i=1,nStep        write(11,*) tplot(i)        write(12,*) xplot(i,1), xplot(i,2), xplot(i,3)        write(13,*) f(i)        write(14,*) spect(i)        write(15,*) spectW(i)      enddo      stop      end!***** To plot in MATLAB; use the script below ********************!load tplot.txt; load xplot.txt; load f.txt;!load spect.txt; load spectw.txt!nstep = length(tplot);  nprint = nstep/8;!%* Graph the displacements of the three masses.!figure(1); clf;  % Clear figure 1 window and bring forward!ipr = 1:nprint:nstep;  % Used to graph limited number of symbols!plot(tplot(ipr),xplot(ipr,1),'o',tplot(ipr),xplot(ipr,2),'+',...!         tplot(ipr),xplot(ipr,3),'*',...!         tplot,xplot(:,1),'-',tplot,xplot(:,2),'-.',...!         tplot,xplot(:,3),'--');!legend('Mass #1','Mass #2','Mass #3');!title('Displacement of masses (relative to rest positions)');!xlabel('Time'); ylabel('Displacement');!%* Graph the power spectra for original and windowed data!figure(2); clf;  % Clear figure 2 window and bring forward!semilogy(f(1:(nstep/2)),spect(1:(nstep/2)),'-',...!       f(1:(nstep/2)),spectw(1:(nstep/2)),'--');!title('Power spectrum (dashed is windowed data)');!xlabel('Frequency'); ylabel('Power');!******************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -