#include "cppdefs.h" #if defined OUTPUTS_SURFACE && defined AVERAGES && ! defined XIOS subroutine set_surf_avg (tile) implicit none integer tile # include "param.h" # include "compute_tile_bounds.h" call set_surf_avg_tile (istr,iend,jstr,jend) return end subroutine set_surf_avg_tile (istr,iend,jstr,jend) ! ! Compute time-averaged fields within a tile. ! ------- ------------- ------ ------ - ----- ! Because of syncronization issues, the delayed mode averaging ! procedure is used. This procedure implies that all fields to be ! averaged are sampled during the next time step, rather than at ! the end of the time step when they were computed. ! ! Thought this algorithm results in somewhat ackwad controlling ! logic it has the advantage that that all fields to be sampled ! correspond to exactly the same time, which is time step "n". ! Particularly, this is done this way because vertical velocity ! corresponding to the newly computed horizontal velocities ! becomes available only during the following time step. ! The same applies to the density field. ! ! The algorithm consists of three logical blocks: (1) initialization ! of the averages arrays: when mod(iic-1,navg).eq.1 the target arrays ! are set to the first contribution; (2) accumulation of averaged ! data, when mod(iic-1,navg).gt.1; and (3) adding the last ! contribution and scaling. ! implicit none integer istr,iend,jstr,jend, i,j, ilc, iflux # ifdef SOLVE3D & , itrc, k # endif real cff # include "param.h" # include "scalars.h" # include "ncscrum.h" # include "grid.h" # include "ocean2d.h" # include "ocean3d.h" # include "averages.h" # include "surf.h" ! #include "compute_auxiliary_bounds.h" ! ilc=1+iic-ntstart ! number of time step since restart ! ! calculation of averaged fluxes will only be performed if ntssurf_avg ! is a positive number ! if (ilc.gt.ntssurf_avg) then if (mod(ilc-ntssurf_avg,nwrtsurf_avg).eq.1) then if (ZEROTH_TILE) then timesurf_avg=time ! MPI_master_only write(*,*) 'started averaging surf',iic, ! & ntssurf_avg,nwrtsurf_avg endif do j=JstrR,JendR do i=IstrR,IendR surft_avg(i,j)=t(i,j,N,nstp,1) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfs_avg(i,j)=t(i,j,N,nstp,2) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfz_avg(i,j)=zeta(i,j,fast_indx_out) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfu_avg(i,j)=u(i,j,N,nstp) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfv_avg(i,j)=v(i,j,N,nstp) enddo enddo elseif (mod(ilc-ntssurf_avg,nwrtsurf_avg).gt.1) then if (ZEROTH_TILE) timesurf_avg=timesurf_avg+time do j=JstrR,JendR do i=IstrR,IendR surft_avg(i,j) = & surft_avg(i,j) + & t(i,j,N,nstp,1) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfs_avg(i,j) = & surfs_avg(i,j) + & t(i,j,N,nstp,2) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfz_avg(i,j) = & surfz_avg(i,j) + & zeta(i,j,fast_indx_out) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfu_avg(i,j) = & surfu_avg(i,j) + & u(i,j,N,nstp) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfv_avg(i,j) = & surfv_avg(i,j) + & v(i,j,N,nstp) enddo enddo elseif (mod(ilc-ntssurf_avg,nwrtsurf_avg).eq.0) then cff=1./float(nwrtsurf_avg) if (ZEROTH_TILE) then timesurf_avg=cff*(timesurf_avg+time) ! MPI_master_only write(*,*) 'finish aver. surf',iic, ! & ntssurf_avg,nwrtsurf_avg endif do j=JstrR,JendR do i=IstrR,IendR surft_avg(i,j) = cff * & ( surft_avg(i,j) + & t(i,j,N,nstp,1) ) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfs_avg(i,j) = cff * & ( surfs_avg(i,j) + & t(i,j,N,nstp,2) ) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfz_avg(i,j) = cff * & ( surfz_avg(i,j) + & zeta(i,j,fast_indx_out) ) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfu_avg(i,j) = cff * & ( surfu_avg(i,j) + & u(i,j,N,nstp) ) enddo enddo do j=JstrR,JendR do i=IstrR,IendR surfv_avg(i,j) = cff * & ( surfv_avg(i,j) + & v(i,j,N,nstp) ) enddo enddo endif endif !<-- iic.gt.ntsavg return end #else /* DIAGNOSTICS_EK && AVERAGES */ subroutine set_surf_avg_empty end #endif /* DIAGNOSTICS_EK && AVERAGES */