LCOV - code coverage report
Current view: top level - synthesis/fortran - wprojgrid.f (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 75 195 38.5 %
Date: 2024-10-10 11:40:37 Functions: 4 8 50.0 %

          Line data    Source code
       1             : *=======================================================================
       2             : *     Copyright (C) 1999,2001,2002
       3             : *     Associated Universities, Inc. Washington DC, USA.
       4             : *
       5             : *     This library is free software; you can redistribute it and/or
       6             : *     modify it under the terms of the GNU Library General Public
       7             : *     License as published by the Free Software Foundation; either
       8             : *     version 2 of the License, or (at your option) any later version.
       9             : *
      10             : *     This library is distributed in the hope that it will be useful,
      11             : *     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12             : *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13             : *     GNU Library General Public License for more details.
      14             : *
      15             : *     You should have received a copy of the GNU Library General Public
      16             : *     License along with this library; if not, write to the Free
      17             : *     Software Foundation, Inc., 675 Massachusetts Ave, Cambridge,
      18             : *     MA 02139, USA.
      19             : *
      20             : *     Correspondence concerning AIPS++ should be addressed as follows:
      21             : *            Internet email: casa-feedback@nrao.edu.
      22             : *            Postal address: AIPS++ Project Office
      23             : *                            National Radio Astronomy Observatory
      24             : *                            520 Edgemont Road
      25             : *                            Charlottesville, VA 22903-2475 USA
      26             : *
      27             : *     $Id: fwproj.f 17791 2004-08-25 02:28:46Z cvsmgr $
      28             : *-----------------------------------------------------------------------
      29             : C
      30             : C Grid a number of visibility records
      31             : C
      32           0 :       subroutine gwgrid (uvw, dphase, values, nvispol, nvischan,
      33           0 :      $     dopsf, flag, rflag, weight, nrow, rownum,
      34           0 :      $     scale, offset, grid, nx, ny, npol, nchan, freq, c,
      35           0 :      $     support, convsize, sampling, wconvsize, convfunc, 
      36           0 :      $     chanmap, polmap,
      37           0 :      $     sumwt)
      38             : 
      39             :       implicit none
      40             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow
      41             :       complex values(nvispol, nvischan, nrow)
      42             :       double complex grid(nx, ny, npol, nchan)
      43             :       double precision uvw(3, nrow), freq(nvischan), c, scale(3),
      44             :      $     offset(3)
      45             :       double precision dphase(nrow), uvdist
      46             :       complex phasor
      47             :       integer flag(nvispol, nvischan, nrow)
      48             :       integer rflag(nrow)
      49             :       real weight(nvischan, nrow), phase
      50             :       double precision sumwt(npol, nchan)
      51             :       integer rownum
      52             :       integer support(*), rsupport
      53             :       integer chanmap(nchan), polmap(npol)
      54             :       integer dopsf
      55             : 
      56             :       double complex nvalue
      57             : 
      58             :       integer convsize, sampling, wconvsize
      59             :       complex convfunc(convsize/2-1, convsize/2-1, wconvsize),
      60             :      $     cwt
      61             : 
      62             :       real norm
      63             :       real wt
      64             : 
      65             :       logical owp
      66             : 
      67             :       double precision pos(3)
      68             :       integer loc(3), off(3), iloc(3)
      69             :       integer rbeg, rend
      70             :       integer ix, iy, ipol, ichan
      71             :       integer apol, achan, irow
      72             :       double precision pi
      73             :       data pi/3.14159265358979323846/
      74             :       
      75           0 :       irow=rownum
      76             : 
      77           0 :       if(irow.ge.0) then
      78           0 :          rbeg=irow+1
      79           0 :          rend=irow+1
      80             :       else 
      81           0 :          rbeg=1
      82           0 :          rend=nrow
      83             :       end if
      84             : 
      85           0 :       do irow=rbeg, rend
      86           0 :          if(rflag(irow).eq.0) then 
      87           0 :          do ichan=1, nvischan
      88           0 :             achan=chanmap(ichan)+1
      89           0 :             if((achan.ge.1).and.(achan.le.nchan).and.
      90           0 :      $           (weight(ichan,irow).ne.0.0)) then
      91             :                call swp(uvw(1,irow), dphase(irow), freq(ichan), c, 
      92           0 :      $              scale, offset, sampling, pos, loc, off, phasor)
      93           0 :                iloc(3)=max(1, min(wconvsize, loc(3)))
      94           0 :                rsupport=support(iloc(3))
      95           0 :                if (owp(nx, ny, wconvsize, loc, rsupport)) then
      96           0 :                   do ipol=1, nvispol
      97           0 :                      apol=polmap(ipol)+1
      98             :                      if((flag(ipol,ichan,irow).ne.1).and.
      99           0 :      $                    (apol.ge.1).and.(apol.le.npol)) then
     100             : C If we are making a PSF then we don't want to phase
     101             : C rotate but we do want to reproject uvw
     102           0 :                         if(dopsf.eq.1) then
     103           0 :                            nvalue=cmplx(weight(ichan,irow))
     104             :                         else
     105             :                            nvalue=weight(ichan,irow)*
     106           0 :      $                          (values(ipol,ichan,irow)*phasor)
     107             :                         end if
     108             : C norm will be the value we would get for the peak
     109             : C at the phase center. We will want to normalize 
     110             : C the final image by this term.
     111           0 :                         norm=0.0
     112           0 :                         do iy=-rsupport,rsupport
     113           0 :                            iloc(2)=1+abs(iy*sampling+off(2))
     114             : C                         !$OMP PARALLEL DEFAULT(SHARED) PRIVATE(ix)
     115             : C                           !SOMP DO
     116           0 :                            do ix=-rsupport,rsupport
     117           0 :                               iloc(1)=1+abs(ix*sampling+off(1))
     118           0 :                               if(uvw(3,irow).gt.0.0) then
     119             :                                  cwt=conjg(convfunc(iloc(1),
     120           0 :      $                                iloc(2), iloc(3)))
     121             :                               else
     122             :                                  cwt=convfunc(iloc(1),
     123           0 :      $                                iloc(2), iloc(3))
     124             :                               end if
     125             :                               grid(loc(1)+ix,
     126             :      $                             loc(2)+iy,apol,achan)=
     127             :      $                             grid(loc(1)+ix,
     128             :      $                             loc(2)+iy,apol,achan)+
     129           0 :      $                             nvalue*cwt
     130           0 :                               norm=norm+real(cwt)
     131             :                            end do
     132             : C                         !$OMP END DO
     133             : C                         !$OMP END PARALLEL
     134             :                         end do
     135             :                         sumwt(apol,achan)=sumwt(apol,achan)+
     136           0 :      $                       weight(ichan,irow)*norm
     137             :                      end if
     138             :                   end do
     139             :                else
     140             : C                  write(*,*) uvw(3,irow), pos(1), pos(2), pos(3),
     141             : C     $                 loc(1), loc(2), loc(3)
     142             :                end if
     143             :             end if
     144             :          end do
     145             :          end if
     146             :       end do
     147           0 :       return
     148             :       end
     149             : 
     150             : 
     151           0 :       subroutine sectgwgridd (uvw, values, nvispol, nvischan,
     152           0 :      $     dopsf, flag, rflag, weight, nrow, 
     153           0 :      $     grid, nx, ny, npol, nchan, 
     154           0 :      $     support, convsize, sampling, wconvsize, convfunc, 
     155           0 :      $     chanmap, polmap,
     156           0 :      $     sumwt, x0,
     157           0 :      $    y0, nxsub, nysub, rbeg, rend, loc, off, phasor)
     158             : 
     159             :       implicit none
     160             :       
     161             :       integer, intent(in) :: nx,ny, npol, nchan, nvispol, nvischan, nrow
     162             :       double precision, intent(in) :: uvw(3, nrow)
     163             :       complex, intent(in) ::  values(nvispol, nvischan, nrow)
     164             :       double complex, intent(inout) ::  grid(nx, ny, npol, nchan)
     165             :       integer, intent(in) :: x0, y0, nxsub, nysub
     166             :       complex, intent(in) ::  phasor(nvischan, nrow) 
     167             :       integer, intent(in) ::  flag(nvispol, nvischan, nrow)
     168             :       integer, intent(in) ::  rflag(nrow)
     169             :       real, intent(in) :: weight(nvischan, nrow)
     170             :       double precision, intent(inout) :: sumwt(npol, nchan)
     171             :       integer, intent(in) ::  support(*)
     172             :       integer :: rsupport
     173             :       integer, intent(in) ::  chanmap(nchan), polmap(npol)
     174             :       integer, intent(in) :: dopsf
     175             : 
     176             :       double complex :: nvalue
     177             : 
     178             :       integer, intent(in) :: convsize, sampling, wconvsize
     179             :       complex, intent(in) :: convfunc(convsize/2-1,convsize/2-1,
     180             :      $  wconvsize)
     181             :       complex :: cwt
     182             : 
     183             :       real :: norm
     184             :       real :: wt
     185             : 
     186             :       logical :: onmywgrid
     187             : 
     188             :       integer, intent(in) ::  loc(3, nvischan, nrow)
     189             :       integer, intent(in) :: off(3, nvischan, nrow)
     190             :       integer :: iloc(3)
     191             :       integer, intent(in) :: rbeg, rend
     192             :       integer :: ix, iy, ipol, ichan
     193             :       integer :: apol, achan, irow
     194             :       integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
     195             : C      complex :: cfunc(convsize/2-1, convsize/2-1)
     196             : C      integer :: npoint
     197             : 
     198           0 :       do irow=rbeg, rend
     199           0 :          if(rflag(irow).eq.0) then 
     200           0 :          do ichan=1, nvischan
     201           0 :             achan=chanmap(ichan)+1
     202           0 :             if((achan.ge.1).and.(achan.le.nchan).and.
     203           0 :      $           (weight(ichan,irow).ne.0.0)) then
     204           0 :                iloc(3)=max(1, min(wconvsize, loc(3, ichan, irow)))
     205           0 :                rsupport=support(iloc(3))
     206             : C               write(*,*) irow, ichan, iloc(3), rsupport 
     207           0 :                if (onmywgrid(loc(1, ichan, irow), nx, ny, wconvsize, 
     208             :      $              x0, y0, nxsub, nysub, rsupport, msupportx, msupporty
     209             :      $         , psupportx, psupporty)) then
     210             : CCC I thought removing the if in the inner loop will be faster
     211             : CCC but not really as i have to calculate more conjg at this stage
     212             : C                  npoint=rsupport*sampling+1
     213             : C                  if(uvw(3,irow).gt.0.0) then
     214             : C                     cfunc(1:npoint, 1:npoint)=conjg(
     215             : C     $                    convfunc(1:npoint,1:npoint,iloc(3)))
     216             : C                  else
     217             : C                     cfunc(1:npoint, 1:npoint)=
     218             : C     $                    convfunc(1:npoint,1:npoint,iloc(3))
     219             : C                  end if
     220             : CCCC
     221           0 :                   do ipol=1, nvispol
     222           0 :                      apol=polmap(ipol)+1
     223             :                      if((flag(ipol,ichan,irow).ne.1).and.
     224           0 :      $                    (apol.ge.1).and.(apol.le.npol)) then
     225             : C If we are making a PSF then we don't want to phase
     226             : C rotate but we do want to reproject uvw
     227           0 :                         if(dopsf.eq.1) then
     228           0 :                            nvalue=cmplx(weight(ichan,irow))
     229             :                         else
     230             :                            nvalue=weight(ichan,irow)*
     231           0 :      $                      (values(ipol,ichan,irow)*phasor(ichan,irow))
     232             :                         end if
     233             : C norm will be the value we would get for the peak
     234             : C at the phase center. We will want to normalize 
     235             : C the final image by this term.
     236           0 :                         norm=0.0
     237             : C                        msupporty=-rsupport
     238             : C                        psupporty=rsupport
     239             : C                        psupportx=rsupport
     240             : C                        msupportx=-rsupport
     241             : C                        if((loc(1, ichan, irow)-rsupport) .lt. x0) 
     242             : C     $                       msupportx=  -(loc(1, ichan, irow)-x0)
     243             : C                        if((loc(1, ichan, irow)+rsupport).ge.(x0+nxsub)) 
     244             : C     $                       psupportx=  x0+nxsub-loc(1, ichan, irow)-1   
     245             : C                        if((loc(2, ichan, irow)-rsupport) .lt. y0) 
     246             : C     $                       msupporty=  -(loc(2, ichan, irow)-y0)
     247             : C                        if((loc(2, ichan, irow)+rsupport).ge.(y0+nysub)) 
     248             : C     $                       psupporty=  y0+nysub-loc(2, ichan, irow)-1 
     249           0 :                         do iy=msupporty,psupporty
     250           0 :                            posy=loc(2, ichan, irow)+iy
     251           0 :                            iloc(2)=1+abs(iy*sampling+off(2, ichan,irow))
     252           0 :                            do ix=msupportx,psupportx
     253           0 :                               posx=loc(1, ichan, irow)+ix
     254             :                               iloc(1)=1+abs(ix*sampling+
     255           0 :      $                             off(1,ichan,irow))
     256             :                               cwt=convfunc(iloc(1),
     257           0 :      $                                iloc(2), iloc(3))
     258           0 :                               if(uvw(3,irow).gt.0.0) cwt=conjg(cwt)
     259             : C                              else
     260             : C                                 cwt=convfunc(iloc(1),
     261             : C     $                                iloc(2), iloc(3))
     262             : C                              end if
     263             :                               grid(posx,posy,apol,achan)=
     264             :      $                             grid(posx,posy,apol,achan)+
     265           0 :      $                             nvalue*cwt
     266           0 :                               norm=norm+real(cwt)
     267             :                            end do
     268             :                         end do
     269             :                         sumwt(apol,achan)=sumwt(apol,achan)+
     270           0 :      $                       weight(ichan,irow)*norm
     271             :                      end if
     272             :                   end do
     273             :                else
     274             : C                  write(*,*) uvw(3,irow), pos(1), pos(2), pos(3),
     275             : C     $                 loc(1), loc(2), loc(3)
     276             :                end if
     277             :             end if
     278             :          end do
     279             :          end if
     280             :       end do
     281           0 :       return
     282             :       end
     283             : C
     284             : C single precision gridder
     285       12800 :       subroutine sectgwgrids (uvw, values, nvispol, nvischan,
     286       12800 :      $     dopsf, flag, rflag, weight, nrow, 
     287       12800 :      $     grid, nx, ny, npol, nchan, 
     288       12800 :      $     support, convsize, sampling, wconvsize, convfunc, 
     289       12800 :      $     chanmap, polmap,
     290       12800 :      $     sumwt, x0,
     291       12800 :      $    y0, nxsub, nysub, rbeg, rend, loc, off, phasor)
     292             : 
     293             :       implicit none
     294             :       
     295             :       integer, intent(in) :: nx,ny, npol, nchan, nvispol, nvischan, nrow
     296             :       double precision, intent(in) :: uvw(3, nrow)
     297             :       complex, intent(in) ::  values(nvispol, nvischan, nrow)
     298             :       complex, intent(inout) ::  grid(nx, ny, npol, nchan)
     299             :       integer, intent(in) :: x0, y0, nxsub, nysub
     300             :       complex, intent(in) ::  phasor(nvischan, nrow) 
     301             :       integer, intent(in) ::  flag(nvispol, nvischan, nrow)
     302             :       integer, intent(in) ::  rflag(nrow)
     303             :       real, intent(in) :: weight(nvischan, nrow)
     304             :       double precision, intent(inout) :: sumwt(npol, nchan)
     305             :       integer, intent(in) ::  support(*)
     306             :       integer :: rsupport
     307             :       integer, intent(in) ::  chanmap(nchan), polmap(npol)
     308             :       integer, intent(in) :: dopsf
     309             : 
     310             :       double complex :: nvalue
     311             : 
     312             :       integer, intent(in) :: convsize, sampling, wconvsize
     313             :       complex, intent(in) :: convfunc(convsize/2-1,convsize/2-1,
     314             :      $  wconvsize)
     315             :       complex :: cwt
     316             : 
     317             :       real :: norm
     318             :       real :: wt
     319             : 
     320             :       logical :: onmywgrid
     321             : 
     322             :       integer, intent(in) ::  loc(3, nvischan, nrow)
     323             :       integer, intent(in) :: off(3, nvischan, nrow)
     324             :       integer :: iloc(3)
     325             :       integer, intent(in) :: rbeg, rend
     326             :       integer :: ix, iy, ipol, ichan
     327             :       integer :: apol, achan, irow
     328             :       integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
     329             : C      complex :: cfunc(convsize/2-1, convsize/2-1)
     330             : C      integer :: npoint
     331             : 
     332     4505600 :       do irow=rbeg, rend
     333     4505600 :          if(rflag(irow).eq.0) then 
     334   453772800 :          do ichan=1, nvischan
     335   449280000 :             achan=chanmap(ichan)+1
     336   449280000 :             if((achan.ge.1).and.(achan.le.nchan).and.
     337     4492800 :      $           (weight(ichan,irow).ne.0.0)) then
     338     4492800 :                iloc(3)=max(1, min(wconvsize, loc(3, ichan, irow)))
     339     4492800 :                rsupport=support(iloc(3))
     340     4492800 :                if (onmywgrid(loc(1, ichan, irow), nx, ny, wconvsize, 
     341             :      $              x0, y0, nxsub, nysub, rsupport, msupportx, 
     342             :      $ msupporty, psupportx, psupporty)) then
     343             : CCC I thought removing the if in the inner loop will be faster
     344             : CCC but not really as i have to calculate more conjg at this stage
     345             : C                  npoint=rsupport*sampling+1
     346             : C                  if(uvw(3,irow).gt.0.0) then
     347             : C                     cfunc(1:npoint, 1:npoint)=conjg(
     348             : C     $                    convfunc(1:npoint,1:npoint,iloc(3)))
     349             : C                  else
     350             : C                     cfunc(1:npoint, 1:npoint)=
     351             : C     $                    convfunc(1:npoint,1:npoint,iloc(3))
     352             : C                  end if
     353             : CCCC
     354     2090520 :                   do ipol=1, nvispol
     355     1672416 :                      apol=polmap(ipol)+1
     356             :                      if((flag(ipol,ichan,irow).ne.1).and.
     357     2090520 :      $                    (apol.ge.1).and.(apol.le.npol)) then
     358             : C If we are making a PSF then we don't want to phase
     359             : C rotate but we do want to reproject uvw
     360      836208 :                         if(dopsf.eq.1) then
     361           0 :                            nvalue=cmplx(weight(ichan,irow))
     362             :                         else
     363             :                            nvalue=weight(ichan,irow)*
     364      836208 :      $                      (values(ipol,ichan,irow)*phasor(ichan,irow))
     365             :                         end if
     366             : C norm will be the value we would get for the peak
     367             : C at the phase center. We will want to normalize 
     368             : C the final image by this term.
     369      836208 :                         norm=0.0
     370             : C                        msupporty=-rsupport
     371             : C                        psupporty=rsupport
     372             : C                        psupportx=rsupport
     373             : C                        msupportx=-rsupport
     374             : C                        if((loc(1, ichan, irow)-rsupport) .lt. x0) 
     375             : C     $                       msupportx=  -(loc(1, ichan, irow)-x0)
     376             : C                        if((loc(1, ichan, irow)+rsupport).ge.(x0+nxsub)) 
     377             : C     $                       psupportx=  x0+nxsub-loc(1, ichan, irow)-1   
     378             : C                        if((loc(2, ichan, irow)-rsupport) .lt. y0) 
     379             : C     $                       msupporty=  -(loc(2, ichan, irow)-y0)
     380             : C                        if((loc(2, ichan, irow)+rsupport).ge.(y0+nysub)) 
     381             : C     $                       psupporty=  y0+nysub-loc(2, ichan, irow)-1 
     382     3834342 :                         do iy=msupporty,psupporty
     383     2998134 :                            posy=loc(2, ichan, irow)+iy
     384     2998134 :                            iloc(2)=1+abs(iy*sampling+off(2, ichan,irow))
     385    15206742 :                            do ix=msupportx,psupportx
     386    11372400 :                               posx=loc(1, ichan, irow)+ix
     387             :                               iloc(1)=1+abs(ix*sampling+
     388    11372400 :      $                             off(1,ichan,irow))
     389             :                               cwt=convfunc(iloc(1),
     390    11372400 :      $                                iloc(2), iloc(3))
     391    11372400 :                               if(uvw(3,irow).gt.0.0) cwt=conjg(cwt)
     392             : C                              else
     393             : C                                 cwt=convfunc(iloc(1),
     394             : C     $                                iloc(2), iloc(3))
     395             : C                              end if
     396             :                               grid(posx,posy,apol,achan)=
     397             :      $                             grid(posx,posy,apol,achan)+
     398    11372400 :      $                             nvalue*cwt
     399    14370534 :                               norm=norm+real(cwt)
     400             :                            end do
     401             :                         end do
     402             :                         sumwt(apol,achan)=sumwt(apol,achan)+
     403      836208 :      $                       weight(ichan,irow)*norm
     404             :                      end if
     405             :                   end do
     406             :                else
     407             : C                  write(*,*) uvw(3,irow), pos(1), pos(2), pos(3),
     408             : C     $                 loc(1), loc(2), loc(3)
     409             :                end if
     410             :             end if
     411             :          end do
     412             :          end if
     413             :       end do
     414       12800 :       return
     415             :       end
     416             : 
     417             : 
     418             : C
     419             : C Degrid a number of visibility records
     420             : C
     421           0 :       subroutine dwgrid (uvw, dphase, values, nvispol, nvischan,
     422           0 :      $     flag, rflag,
     423           0 :      $     nrow, rownum, scale, offset, grid, nx, ny, npol, nchan, freq,
     424           0 :      $     c, support, convsize, sampling, wconvsize, convfunc,
     425             :      $     chanmap, polmap)
     426             : 
     427             :       implicit none
     428             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow
     429             :       complex values(nvispol, nvischan, nrow)
     430             :       complex grid(nx, ny, npol, nchan)
     431             :       double precision uvw(3, nrow), freq(nvischan), c, scale(3),
     432             :      $     offset(3)
     433             :       double precision dphase(nrow), uvdist
     434             :       complex phasor
     435             :       integer flag(nvispol, nvischan, nrow)
     436             :       integer rflag(nrow)
     437             :       integer rownum
     438             :       integer support(*), rsupport
     439             :       integer chanmap(*), polmap(*)
     440             : 
     441             :       complex nvalue
     442             : 
     443             :       integer convsize, wconvsize, sampling
     444             :       complex convfunc(convsize/2-1, convsize/2-1, wconvsize),
     445             :      $     cwt
     446             : 
     447             :       real norm, phase
     448             : 
     449             :       logical owp
     450             : 
     451             :       double precision pos(3)
     452             :       integer loc(3), off(3), iloc(3)
     453             :       integer rbeg, rend
     454             :       integer ix, iy, ipol, ichan
     455             :       integer apol, achan, irow
     456             :       real wt, wtx, wty
     457             :       double precision pi
     458             :       data pi/3.14159265358979323846/
     459             : 
     460           0 :       irow=rownum
     461             : 
     462           0 :       if(irow.ge.0) then
     463           0 :          rbeg=irow+1
     464           0 :          rend=irow+1
     465             :       else 
     466           0 :          rbeg=1
     467           0 :          rend=nrow
     468             :       end if
     469             : C
     470             : 
     471           0 :       do irow=rbeg, rend
     472           0 :          if(rflag(irow).eq.0) then
     473           0 :          do ichan=1, nvischan
     474           0 :             achan=chanmap(ichan)+1
     475           0 :             if((achan.ge.1).and.(achan.le.nchan)) then
     476             :                call swp(uvw(1,irow), dphase(irow), freq(ichan), c,
     477           0 :      $              scale, offset, sampling, pos, loc, off, phasor)
     478           0 :                iloc(3)=max(1, min(wconvsize, loc(3)))
     479           0 :                rsupport=support(iloc(3))
     480           0 :                if (owp(nx, ny, wconvsize, loc, rsupport)) then
     481           0 :                   do ipol=1, nvispol
     482           0 :                      apol=polmap(ipol)+1
     483             :                      if((flag(ipol,ichan,irow).ne.1).and.
     484           0 :      $                    (apol.ge.1).and.(apol.le.npol)) then
     485             : 
     486           0 :                         nvalue=0.0
     487           0 :                         do iy=-rsupport,rsupport
     488           0 :                            iloc(2)=1+abs(iy*sampling+off(2))
     489           0 :                            do ix=-rsupport,rsupport
     490           0 :                               iloc(1)=1+abs(ix*sampling+off(1))
     491           0 :                               if(uvw(3,irow).gt.0.0) then
     492             :                                  cwt=conjg(convfunc(iloc(1),
     493           0 :      $                                iloc(2), iloc(3)))
     494             :                               else
     495             :                                  cwt=convfunc(iloc(1),
     496           0 :      $                                iloc(2), iloc(3))
     497             :                               end if
     498             :                               nvalue=nvalue+conjg(cwt)*
     499           0 :      $                             grid(loc(1)+ix,loc(2)+iy,apol,achan)
     500             :                            end do
     501             :                         end do
     502           0 :                         values(ipol,ichan,irow)=nvalue*conjg(phasor)
     503             :                      end if
     504             :                   end do
     505             :                end if
     506             :             end if
     507             :          end do
     508             :          end if
     509             :       end do
     510           0 :       return
     511             :       end
     512             : C
     513             : 
     514        6400 :       subroutine sectdwgrid (uvw, values, nvispol, nvischan,
     515        6400 :      $     flag, rflag,
     516        6400 :      $     nrow, grid, nx, ny, npol, nchan, 
     517        6400 :      $     support, convsize, sampling, wconvsize, convfunc,
     518        6400 :      $     chanmap, polmap,  rbeg, rend, loc,off,phasor)
     519             : 
     520             :       implicit none
     521             :       integer, intent(in) ::  nrow,nx,ny,npol, nchan, nvispol, nvischan
     522             :       complex, intent(inout) ::  values(nvispol, nvischan, nrow)
     523             :       complex, intent(in) :: grid(nx, ny, npol, nchan)
     524             :       double precision, intent(in) ::  uvw(3, nrow)
     525             :       complex , intent(in) :: phasor(nvischan, nrow) 
     526             :       integer, intent(in) ::  flag(nvispol, nvischan, nrow)
     527             :       integer, intent(in) :: rflag(nrow)
     528             :       integer, intent(in) ::  support(*), sampling
     529             :       integer, intent(in) :: chanmap(*), polmap(*)
     530             :       integer, intent(in) :: rbeg, rend
     531             :       integer, intent(in)  :: loc(3, nvischan, nrow)
     532             :       integer, intent(in) :: off(3, nvischan, nrow) 
     533             :       complex :: nvalue
     534             : 
     535             :       integer, intent(in) :: convsize, wconvsize
     536             :       complex, intent(in) :: convfunc(convsize/2-1, convsize/2-1, 
     537             :      $     wconvsize)
     538             :       complex ::     cwt
     539             : 
     540             :       real :: norm, phase
     541             : 
     542             :       logical :: owp
     543             : 
     544             :       integer :: iloc(3), rsupport
     545             :       integer :: ix, iy, ipol, ichan
     546             :       integer :: apol, achan, irow
     547             :       real :: wt, wtx, wty
     548             : 
     549             : 
     550       76600 :       do irow=rbeg, rend
     551       76600 :          if(rflag(irow).eq.0) then
     552     7090200 :          do ichan=1, nvischan
     553     7020000 :             achan=chanmap(ichan)+1
     554     7090200 :             if((achan.ge.1).and.(achan.le.nchan)) then
     555       70200 :                iloc(3)=max(1, min(wconvsize, loc(3, ichan, irow)))
     556       70200 :                rsupport=support(iloc(3))
     557       70200 :                if (owp(nx, ny, wconvsize, loc(1,ichan,irow), rsupport))
     558             :      $              then
     559      351000 :                   do ipol=1, nvispol
     560      280800 :                      apol=polmap(ipol)+1
     561             :                      if((flag(ipol,ichan,irow).ne.1).and.
     562      351000 :      $                    (apol.ge.1).and.(apol.le.npol)) then
     563             : 
     564      140400 :                         nvalue=0.0
     565     1404000 :                         do iy=-rsupport,rsupport
     566     1263600 :                            iloc(2)=1+abs(iy*sampling+off(2,ichan,irow))
     567    12776400 :                            do ix=-rsupport,rsupport
     568             :                               iloc(1)=1+abs(ix*sampling+
     569    11372400 :      $                             off(1,ichan,irow))
     570             :                               
     571    11372400 :                               if(uvw(3,irow).gt.0.0) then
     572             :                                  cwt=conjg(convfunc(iloc(1),
     573     7536078 :      $                                iloc(2), iloc(3)))
     574             :                               else
     575             :                                  cwt=convfunc(iloc(1),
     576     3836322 :      $                                iloc(2), iloc(3))
     577             :                               end if
     578             :                               nvalue=nvalue+conjg(cwt)*
     579             :      $                           grid(loc(1,ichan,irow)+ix,loc(2,ichan,
     580    12636000 :      $                           irow)+iy,apol,achan)
     581             :                            end do
     582             :                         end do
     583             :                         values(ipol,ichan,irow)=nvalue*conjg(
     584      140400 :      $                       phasor(ichan, irow))
     585             :                      end if
     586             :                   end do
     587             :                end if
     588             :             end if
     589             :          end do
     590             :          end if
     591             :       end do
     592        6400 :       return
     593             :       end
     594             : C
     595             : 
     596             : 
     597             : 
     598             : C Calculate gridded coordinates and the phasor needed for
     599             : C phase rotation. 
     600             : C
     601           0 :       subroutine swp (uvw, dphase, freq, c, scale, offset, 
     602             :      $     sampling, pos, loc, off, phasor)
     603             :       implicit none
     604             :       integer loc(3), off(3), sampling
     605             :       double precision uvw(3), freq, c, scale(3), offset(3)
     606             :       double precision pos(3)
     607             :       double precision dphase, phase
     608             :       complex phasor
     609             :       integer idim
     610             :       double precision pi
     611             :       data pi/3.14159265358979323846/
     612             : 
     613             : C      pos(3)=(scale(3)*uvw(3)*freq/c)*(scale(3)*uvw(3)*freq/c)
     614             : C     $     +offset(3)+1.0;
     615             : C      pos(3)=(scale(3)*uvw(3)*freq/c)+offset(3)+1.0;
     616           0 :       pos(3)=sqrt(abs(scale(3)*uvw(3)*freq/c))+offset(3)+1.0
     617           0 :       loc(3)=nint(pos(3))
     618           0 :       off(3)=0
     619             : 
     620           0 :       do idim=1,2
     621             :          pos(idim)=scale(idim)*uvw(idim)*freq/c+
     622           0 :      $        (offset(idim)+1.0)
     623           0 :          loc(idim)=nint(pos(idim))
     624           0 :          off(idim)=nint((loc(idim)-pos(idim))*sampling)
     625             :       end do
     626             : 
     627           0 :       phase=-2.0D0*pi*dphase*freq/c
     628           0 :       phasor=cmplx(cos(phase), sin(phase))
     629           0 :       return 
     630             :       end
     631       70200 :       logical function owp (nx, ny, nw, loc, support)
     632             :       implicit none
     633             :       integer nx, ny, nw, loc(3), support
     634             :       owp=(support.gt.0).and.
     635             :      $     (loc(1)-support.ge.1).and.(loc(1)+support.le.nx).and.
     636             :      $     (loc(2)-support.ge.1).and.(loc(2)+support.le.ny).and.
     637       70200 :      $     (loc(3).ge.1).and.(loc(3).le.nw)
     638       70200 :       return
     639             :       end
     640     4492800 :       logical function onmywgrid(loc, nx, ny, nw, nx0, ny0, nxsub,nysub,
     641             :      $     support, msuppx, msuppy, psuppx, psuppy)
     642             :       implicit none
     643             :       integer, intent(in) :: nx, ny, nw, nx0, ny0, nxsub, nysub, loc(3), 
     644             :      $     support
     645             :       integer, intent(out) :: msuppx, msuppy, psuppx, psuppy
     646             :       integer :: loc1sub, loc1plus, loc2sub, loc2plus
     647     4492800 :       msuppx=merge(-support, nx0-loc(1), loc(1)-support  >= nx0)
     648     4492800 :       msuppy=merge(-support, ny0-loc(2), loc(2)-support >= ny0)
     649             :       psuppx=merge(support, nx0+nxsub-loc(1)-1 , (loc(1)+support) 
     650     4492800 :      $ < (nx0+nxsub))
     651             :       psuppy=merge(support, ny0+nysub-loc(2)-1 , (loc(2)+support) 
     652     4492800 :      $ < (ny0+nysub))
     653     4492800 :       loc1sub=loc(1)-support
     654     4492800 :       loc1plus=loc(1)+support
     655     4492800 :       loc2sub=loc(2)-support
     656     4492800 :       loc2plus=loc(2)+support
     657             :       
     658             :        onmywgrid=(support.gt.0).and. (loc(3).ge.1) .and. (loc(3).le.nw)
     659             :      $     .and. (loc1plus .ge. nx0) .and. (loc1sub 
     660             :      $     .le. (nx0+nxsub)) .and.(loc2plus .ge. ny0) .and. 
     661     4492800 :      $     (loc2sub .le. (ny0+nysub))
     662     4492800 :        return
     663             :        end

Generated by: LCOV version 1.16