integer function lenstr (string) ! returns string's length ignoring the rightmost blank and null characters implicit none character *(*) string integer k lenstr = 0 do k = 1,len(string) if (string(k:k).ne.' '.and.string(k:k).ne.char(0)) then lenstr = lenstr+1 end if end do 111 return end subroutine averageXY(f,dimx1,dimx2,dimy1,dimy2,dimz,fm) use crmx_grid implicit none integer dimx1, dimx2, dimy1, dimy2, dimz real f(dimx1:dimx2, dimy1:dimy2, dimz),fm(nzm) real(kind=selected_real_kind(12)) ff,factor integer i,j,k factor = 1./dble(nx*ny) do k =1,nzm ff = 0. do j =1,ny do i =1,nx ff = ff + f(i,j,k) end do end do ff = ff*factor fm(k) = real(ff) end do end subroutine averageXY_MPI(f,dimx1,dimx2,dimy1,dimy2,dimz,fm) use crmx_grid implicit none integer dimx1, dimx2, dimy1, dimy2, dimz real f(dimx1:dimx2, dimy1:dimy2, dimz),fm(nzm) real(kind=selected_real_kind(12)) fm1(nzm),fm2(nzm),factor integer i,j,k factor = 1./dble(nx*ny) do k =1,nzm fm1(k) = 0. do j =1,ny do i =1,nx fm1(k) = fm1(k) + f(i,j,k) end do end do fm1(k) = fm1(k) * factor end do if(dompi) then do k =1,nzm fm2(k) = fm1(k) end do call task_sum_real8(fm2,fm1,nzm) do k=1,nzm fm(k)=real(fm1(k)/dble(nsubdomains)) end do else do k=1,nzm fm(k)=real(fm1(k)) end do endif end subroutine fminmax_print(name,f,dimx1,dimx2,dimy1,dimy2,dimz) use crmx_grid implicit none integer dimx1, dimx2, dimy1, dimy2, dimz real f(dimx1:dimx2, dimy1:dimy2, dimz),fmn(nz),fmx(nz) character *(*) name real fmin(1),fmax(1),fff(1) integer i,j,k do k=1,dimz if(dimx2.eq.1.and.dimy2.eq.1) then fmn(k) = f(1,1,k) fmx(k) = f(1,1,k) else fmn(k) = 1.e30 fmx(k) =-1.e30 do j=1,ny do i=1,nx fmn(k) = min(fmn(k),f(i,j,k)) fmx(k) = max(fmx(k),f(i,j,k)) end do enddo end if enddo fmin(1) = 1.e30 fmax(1) =-1.e30 do k=1,dimz fmin(1) = min(fmin(1),fmn(k)) fmax(1) = max(fmax(1),fmx(k)) end do if(dompi) then fff(1)=fmax(1) call task_max_real(fff(1),fmax(1),1) fff(1)=fmin(1) call task_min_real(fff(1),fmin(1),1) end if if(masterproc) print *,name,fmin,fmax end subroutine setvalue(f,n,f0) implicit none integer n real f(n), f0 integer k do k=1,n f(k)=f0 end do end ! determine number of byte in a record in direct access files (can be anything, from 1 to 8): ! can't assume 1 as it is compiler and computer dependent integer function bytes_in_rec() implicit none character*8 str integer n, err open(1,status ='scratch',access ='direct',recl=1) do n = 1,8 write(1,rec=1,iostat=err) str(1:n) if (err.ne.0) exit bytes_in_rec = n enddo close(1,status='delete') end