LCOV - code coverage report
Current view: top level - synthesis/fortran - fpbwproj.f (source / functions) Hit Total Coverage
Test: ctest_coverage.info Lines: 0 285 0.0 %
Date: 2023-11-02 14:27:30 Functions: 0 6 0.0 %

          Line data    Source code
       1             : *=======================================================================
       2             : * -*- FORTRAN -*-
       3             : *     Copyright (C) 1999,2001,2002
       4             : *     Associated Universities, Inc. Washington DC, USA.
       5             : *
       6             : *     This library is free software; you can redistribute it and/or
       7             : *     modify it under the terms of the GNU Library General Public
       8             : *     License as published by the Free Software Foundation; either
       9             : *     version 2 of the License, or (at your option) any later version.
      10             : *
      11             : *     This library is distributed in the hope that it will be useful,
      12             : *     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : *     GNU Library General Public License for more details.
      15             : *
      16             : *     You should have received a copy of the GNU Library General Public
      17             : *     License along with this library; if not, write to the Free
      18             : *     Software Foundation, Inc., 675 Massachusetts Ave, Cambridge,
      19             : *     MA 02139, USA.
      20             : *
      21             : *     Correspondence concerning AIPS++ should be addressed as follows:
      22             : *            Internet email: aips2-request@nrao.edu.
      23             : *            Postal address: AIPS++ Project Office
      24             : *                            National Radio Astronomy Observatory
      25             : *                            520 Edgemont Road
      26             : *                            Charlottesville, VA 22903-2475 USA
      27             : *
      28             : *     $Id: fpbwproj.f,v 1.13 2006/07/20 00:24:20 sbhatnag Exp $
      29             : *-----------------------------------------------------------------------
      30             : C
      31             : C Grid a number of visibility records
      32             : C
      33           0 :       subroutine gpbwproj (uvw, dphase, values, nvispol, nvischan,
      34           0 :      $     dopsf, flag, rflag, weight, nrow, rownum,
      35           0 :      $     scale, offset, grid, nx, ny, npol, nchan, freq, c,
      36           0 :      $     support, convsize, sampling, wconvsize, convfunc, 
      37           0 :      $     chanmap, polmap,polused,sumwt,
      38           0 :      $     ant1, ant2, nant, scanno, sigma,raoff, decoff,area,
      39           0 :      $     dograd,dopointingcorrection,npa,paindex,cfmap,conjcfmap,
      40             :      $     currentCFPA,actualPA,cfRefFreq)
      41             : 
      42             : 
      43             :       implicit none
      44             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow,polused
      45             :       integer npa,paindex
      46             :       integer convsize, sampling, wconvsize,dograd,dopointingcorrection
      47             :       complex values(nvispol, nvischan, nrow)
      48             :       complex grid(nx, ny, npol, nchan)
      49             :       double precision uvw(3, nrow), freq(nvischan), c, scale(3),
      50             :      $     offset(3),currentCFPA,actualPA,cfRefFreq
      51             :       double precision dphase(nrow), uvdist
      52             :       complex phasor
      53             :       integer flag(nvispol, nvischan, nrow)
      54             :       integer rflag(nrow)
      55             :       real weight(nvischan, nrow), phase
      56             :       double precision sumwt(npol, nchan)
      57             :       integer rownum
      58             :       integer support(wconvsize,polused,npa), rsupport
      59             :       integer chanmap(nchan), polmap(npol),cfmap(npol),conjcfmap(npol)
      60             :       integer dopsf
      61             : 
      62             :       complex nvalue
      63             : 
      64             : C      complex convfunc(convsize/2-1, convsize/2-1, wconvsize, polused),
      65             :       complex convfunc(convsize, convsize, wconvsize, polused),
      66             :      $     cwt
      67             : 
      68             :       real norm
      69             :       complex cnorm,tcnorm
      70             :       real wt
      71             : 
      72             :       logical opbwproj,reindex
      73             :       external nwcppeij
      74             : 
      75             :       real pos(3)
      76             :       integer loc(3), off(3), iloc(3),iu,iv
      77             :       integer rbeg, rend
      78             :       integer ix, iy, ipol, ichan
      79             :       integer apol, achan, irow, PolnPlane, ConjPlane
      80             :       double precision pi,tc,ts,cfscale,ixr,iyr
      81             :       data pi/3.14159265358979323846/
      82             : 
      83             :       double precision griduvw(2),dPA, cDPA,sDPA
      84             :       double precision mysigma, ra1,ra2,dec1,dec2
      85             :       double precision sigma,area,lambda
      86             :       complex pcwt, pdcwt1, pdcwt2
      87             :       integer nant, scanno, ant1(nrow), ant2(nrow)
      88             :       integer convOrigin
      89             :       real raoff(nant), decoff(nant)
      90             : 
      91             : 
      92             :       integer ii,jj,kk,imax,jmax
      93             :       real tmp
      94             : 
      95           0 :       irow=rownum
      96             : 
      97           0 :       if(irow.ge.0) then
      98           0 :          rbeg=irow+1
      99           0 :          rend=irow+1
     100             :       else 
     101           0 :          rbeg=1
     102           0 :          rend=nrow
     103             :       end if
     104           0 :       cfscale=1.0
     105           0 :       dPA = -(currentCFPA - actualPA)
     106             : c      dPA = 0
     107           0 :       cDPA = cos(dPA)
     108           0 :       sDPA = sin(dPA)
     109             : 
     110           0 :       convOrigin = (convsize-1)/2
     111             : c      convOrigin = (convsize+1)/2
     112             : c$$$      write(*,*) convOrigin, convsize, (convsize/2),
     113             : c$$$     $     convfunc(convOrigin,convOrigin,1,1)
     114           0 :       do irow=rbeg, rend
     115           0 :          if(rflag(irow).eq.0) then 
     116           0 :             do ichan=1, nvischan
     117           0 :                achan=chanmap(ichan)+1
     118             : 
     119           0 :                lambda = c/freq(ichan)
     120             : 
     121           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
     122           0 :      $              (weight(ichan,irow).ne.0.0)) then
     123             :                   call spbwproj(uvw(1,irow), dphase(irow), 
     124             :      $                 freq(ichan), c, scale, offset, sampling, 
     125           0 :      $                 pos, loc, off, phasor)
     126           0 :                   iloc(3)=max(1, min(wconvsize, loc(3)))
     127           0 :                   rsupport=support(iloc(3),1,paindex)
     128           0 :                   if (opbwproj(nx, ny, wconvsize, loc, rsupport)) then
     129           0 :                      PolnPlane=polused+1
     130             : 
     131           0 :                      do ipol=1, nvispol
     132           0 :                         apol=polmap(ipol)+1
     133             :                      
     134             :                         if((flag(ipol,ichan,irow).ne.1).and.
     135           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
     136             : 
     137             : c$$$                           ConjPlane = conjcfmap(ipol)+1
     138             : c$$$                           PolnPlane = cfmap(ipol)+1
     139             : C
     140             : C The following after feed_x -> -feed_x and PA -> PA + PI/2
     141           0 :                            ConjPlane = cfmap(ipol)+1
     142           0 :                            PolnPlane = conjcfmap(ipol)+1
     143             : C
     144             : C If we are making a PSF then we don't want to phase rotate but we do want 
     145             : C to reproject uvw
     146             : C
     147           0 :                            if(dopsf.eq.1) then
     148           0 :                               nvalue=cmplx(weight(ichan,irow))
     149             :                            else
     150             :                               nvalue=weight(ichan,irow)*
     151           0 :      $                             (values(ipol,ichan,irow)*phasor)
     152             :                            end if
     153             : C
     154             : C norm will be the value we would get for the peak at the phase center. 
     155             : C We will want to normalize the final image by this term.
     156             : C
     157           0 :                            norm=0.0
     158           0 :                            cnorm=cmplx(1.0,0.0)
     159           0 :                            cnorm=0.0
     160           0 :                            tcnorm=0.0
     161           0 :                            do iy=-rsupport,rsupport
     162             : c$$$                              iloc(2)=1+(iy*sampling+off(2))
     163             : c$$$     $                             +convOrigin
     164             : c$$$                              ii=iloc(2)
     165           0 :                               iloc(2)=(iy*sampling+off(2))
     166           0 :                               iv = iloc(2)
     167           0 :                               do ix=-rsupport,rsupport
     168             : c$$$                                 iloc(1)=1+(ix*sampling+off(1))
     169             : c$$$     $                                +convOrigin
     170             : c$$$                                 jj=iloc(1)
     171           0 :                                  iloc(1)=(ix*sampling+off(1))
     172             :                                  
     173           0 :                                  iu = iloc(1)
     174             : 
     175             : c$$$                                 ixr = ix*sampling*cfscale
     176             : c$$$                                 iyr = iy*sampling*cfscale
     177             : c$$$                                 iu = nint(cDPA*ixr + sDPA*iyr)
     178             : c$$$                                 iv = nint(-sDPA*ixr + cDPA*iyr)
     179             : c$$$                                 iu=iu+off(1)*cfscale
     180             : c$$$                                 iv=iv+off(2)*cfscale
     181             : 
     182           0 :                                  ixr = (ix*sampling+off(1))*cfscale
     183           0 :                                  iyr = (iy*sampling+off(2))*cfscale
     184           0 :                                  iu = nint(cDPA*ixr + sDPA*iyr)
     185           0 :                                  iv = nint(-sDPA*ixr + cDPA*iyr)
     186             : 
     187           0 :                                  ts=0.0
     188           0 :                                  tc=1.0
     189           0 :                                  if (reindex(iu,iv,iloc(1),iloc(2),
     190             :      $                                ts,tc,
     191           0 :      $                                convOrigin, convSize)) then
     192           0 :                                     if (dopointingcorrection .eq. 1) 
     193             :      $                                   then
     194             : c$$$                                       griduvw(1) = (loc(1)-offset(1)+
     195             : c$$$     $                                      ix-1)
     196             : c$$$     $                                      /scale(1)-uvw(1,irow)/lambda
     197             : c$$$                                       griduvw(2) = (loc(2)-offset(2)+
     198             : c$$$     $                                      iy-1)
     199             : c$$$     $                                      /scale(2)-uvw(2,irow)/lambda
     200           0 :                                        iu=iu-off(1)*cfscale
     201           0 :                                        iv=iv-off(2)*cfscale
     202           0 :                                      griduvw(1)=(iu)/(scale(1)*sampling)
     203           0 :                                      griduvw(2)=(iv)/(scale(2)*sampling)
     204           0 :                                        ra1 = raoff(ant1(irow)+1)
     205           0 :                                        ra2 = raoff(ant2(irow)+1)
     206           0 :                                        dec1= decoff(ant1(irow)+1)
     207           0 :                                        dec2= decoff(ant2(irow)+1)
     208             :                                        call nwcppeij(griduvw,area,
     209             :      $                                      ra1,dec1,ra2,dec2,
     210             :      $                                      dograd,pcwt,pdcwt1,pdcwt2,
     211           0 :      $                                      currentCFPA)
     212             :                                     else 
     213           0 :                                        pcwt=cmplx(1.0,0.0)
     214             :                                     endif
     215             : c$$$                                    if(uvw(3,irow).gt.0.0) then
     216             : c$$$                                       cwt=conjg(convfunc(iloc(1),
     217             : c$$$     $                                      iloc(2), iloc(3),
     218             : c$$$     $                                      ConjPlane))
     219             : c$$$                                       pcwt=conjg(pcwt)
     220             : c$$$                                    else
     221             : c$$$                                       cwt=(convfunc(iloc(1),
     222             : c$$$     $                                      iloc(2), iloc(3),
     223             : c$$$     $                                      PolnPlane))
     224             : c$$$c                                       pcwt=conjg(pcwt)
     225             : c$$$                                    end if
     226             :                                     
     227             :                                     cwt=(convfunc(iloc(1),
     228             :      $                                   iloc(2), iloc(3),
     229           0 :      $                                   PolnPlane))
     230           0 :                                     cwt = cwt * pcwt
     231           0 :                                     if (dopsf .eq. 1) then
     232             : C                                       cnorm=cnorm+real(cwt)
     233           0 :                                        cnorm=cnorm+cwt
     234             :                                     else
     235           0 :                                        cnorm=cnorm+cwt
     236             :                                     endif
     237             :                                  endif
     238             :                               enddo
     239             :                            enddo
     240             : C                           stop
     241             : c$$$                        else
     242             : c$$$                           cnorm=cmplx(1.0,0.0)
     243             : c$$$                        endif
     244             :                         
     245             :                         
     246           0 :                            do iy=-rsupport,rsupport
     247           0 :                               iloc(2)=(iy*sampling+off(2))
     248           0 :                               iv = iloc(2)
     249           0 :                               do ix=-rsupport,rsupport
     250           0 :                                  iloc(1)=(ix*sampling+off(1))
     251           0 :                                  iu = iloc(1)
     252             : 
     253             : c$$$                                 ixr = ix*sampling*cfscale
     254             : c$$$                                 iyr = iy*sampling*cfscale
     255             : c$$$                                 iu = nint(cDPA*ixr + sDPA*iyr)
     256             : c$$$                                 iv = nint(-sDPA*ixr + cDPA*iyr)
     257             : c$$$                                 iu=iu+off(1)*cfscale
     258             : c$$$                                 iv=iv+off(2)*cfscale
     259             : 
     260           0 :                                  ixr = (ix*sampling+off(1))*cfscale
     261           0 :                                  iyr = (iy*sampling+off(2))*cfscale
     262           0 :                                  iu = nint(cDPA*ixr + sDPA*iyr)
     263           0 :                                  iv = nint(-sDPA*ixr + cDPA*iyr)
     264             : 
     265           0 :                                  ts=0.0
     266           0 :                                  tc=1.0
     267           0 :                                  if (reindex(iu,iv,iloc(1),iloc(2),
     268             :      $                                ts,tc,
     269           0 :      $                                convOrigin,convSize)) then
     270             : C
     271             : C Compute the pointing offset term
     272             : C
     273           0 :                                     if (dopointingcorrection .eq. 1) 
     274             :      $                                   then
     275             : c$$$                                       iu=iu-off(1)*cfscale
     276             : c$$$                                       iv=iv-off(2)*cfscale
     277             : C
     278             : C     Use the rotated CF co-oridinates to compute the phase grad.  This
     279             : C     effectively rotates the pointing vector with the PA
     280             : C
     281           0 :                                        iu = iloc(1)-convOrigin
     282           0 :                                        iv = iloc(2)-convOrigin
     283             :                                        griduvw(1)=(iu)/
     284           0 :      $                                      (scale(1)*sampling)
     285             :                                        griduvw(2)=(iv)/
     286           0 :      $                                      (scale(2)*sampling)
     287           0 :                                        ra1 = raoff(ant1(irow)+1)
     288           0 :                                        ra2 = raoff(ant2(irow)+1)
     289           0 :                                        dec1= decoff(ant1(irow)+1)
     290           0 :                                        dec2= decoff(ant2(irow)+1)
     291             :                                        call nwcppeij(griduvw,area,
     292             :      $                                      ra1,dec1,ra2,dec2,
     293             :      $                                      dograd,pcwt,pdcwt1,pdcwt2,
     294           0 :      $                                      currentCFPA)
     295             :                                     else 
     296           0 :                                        pcwt=cmplx(1.0,0.0)
     297             :                                     endif
     298             : 
     299             : c$$$                                    if(uvw(3,irow).gt.0.0) then
     300             : c$$$                                       cwt=conjg(convfunc(iloc(1),
     301             : c$$$     $                                      iloc(2), iloc(3),
     302             : c$$$     $                                      ConjPlane))
     303             : c$$$                                       pcwt=conjg(pcwt)
     304             : c$$$                                    else
     305             : c$$$                                       cwt=(convfunc(iloc(1),
     306             : c$$$     $                                      iloc(2), iloc(3),
     307             : c$$$     $                                      PolnPlane))
     308             : c$$$                                       pcwt=(pcwt)
     309             : c$$$                                    end if
     310             :                                     cwt=(convfunc(iloc(1),
     311             :      $                                   iloc(2), iloc(3),
     312           0 :      $                                   PolnPlane))
     313           0 :                                     cwt = cwt * pcwt
     314             : c$$$                                    if (dopsf .eq. 1) then
     315             : c$$$                                       cwt = real(cwt)
     316             : c$$$                                    endif
     317             :                                     grid(loc(1)+ix,
     318             :      $                                   loc(2)+iy,apol,achan)=
     319             :      $                                   grid(loc(1)+ix,
     320             :      $                                   loc(2)+iy,apol,achan)+
     321             :      $                                   nvalue*cwt
     322           0 :      $                                   /cnorm
     323             : c                                    norm=norm+real(cwt/cnorm)
     324             : c$$$                                    write(*,*) 'G ',abs(cwt),
     325             : c$$$     $                                   ix,iy,iloc(1),iloc(2)
     326           0 :                                     tcnorm=tcnorm+(cwt/cnorm)
     327             : c                              cnorm=cnorm+cwt
     328             :                                  endif
     329             :                               end do
     330             : c$$$                              write(*,*)
     331             :                            end do
     332             : c$$$                           stop
     333           0 :                            norm=real(tcnorm)
     334             :                            sumwt(apol,achan)=sumwt(apol,achan)+
     335           0 :      $                          weight(ichan,irow)*norm
     336             :                         end if
     337             :                      end do
     338             : c               else
     339             :                   end if
     340             :                end if
     341             :             end do
     342             :          end if
     343             :       end do
     344             : c      write(*,*)'Gridded ',irow,' visibilities'
     345             : c$$$      close(11)
     346             : c$$$      close(12)
     347           0 :       return
     348             :       end
     349             : C
     350             : C Degrid a number of visibility records
     351             : C
     352           0 :       subroutine dpbwproj (uvw, dphase, values, nvispol, nvischan,
     353           0 :      $     flag, rflag,
     354           0 :      $     nrow, rownum, scale, offset, grid, nx, ny, npol, nchan, freq,
     355           0 :      $     c, support, convsize, sampling, wconvsize, convfunc,
     356           0 :      $     chanmap, polmap,polused, ant1, ant2, nant, 
     357           0 :      $     scanno, sigma, raoff, decoff,area,dograd,
     358           0 :      $     dopointingcorrection,npa,paindex,cfmap,conjcfmap,
     359             :      $     currentCFPA,actualPA,cfRefFreq)
     360             : 
     361             :       implicit none
     362             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow,polused
     363             :       integer npa,paindex
     364             :       integer convsize, wconvsize, sampling
     365             :       complex values(nvispol, nvischan, nrow)
     366             :       complex grid(nx, ny, npol, nchan)
     367             :       double precision uvw(3, nrow), freq(nvischan), c, scale(3),
     368             :      $     offset(3),currentCFPA,actualPA, dPA, sDPA, cDPA,cfRefFreq
     369             :       double precision dphase(nrow), uvdist
     370             :       complex phasor
     371             :       integer flag(nvispol, nvischan, nrow)
     372             :       integer rflag(nrow),cfmap(npol),conjcfmap(npol)
     373             :       integer rownum
     374             :       integer support(wconvsize,polused,npa), rsupport
     375             :       integer chanmap(*), polmap(*)
     376             : 
     377             :       integer nant, scanno, ant1(nrow), ant2(nrow),dograd,
     378             :      $     dopointingcorrection
     379             :       real raoff(nant), decoff(nant)
     380             :       double precision sigma,area,lambda
     381             : 
     382             :       complex nvalue
     383             : 
     384             : C      complex convfunc(convsize/2-1, convsize/2-1, wconvsize, polused),
     385             :       complex convfunc(convsize, convsize, wconvsize, polused),
     386             :      $     cwt, pcwt,pdcwt1,pdcwt2
     387             :       double precision griduvw(2)
     388             :       double precision mysigma, ra1,ra2,dec1,dec2
     389             : 
     390             :       complex norm(4)
     391             : 
     392             :       logical opbwproj,reindex
     393             :       external nwcppEij
     394             : 
     395             :       real pos(3)
     396             :       integer loc(3), off(3), iloc(3)
     397             :       integer rbeg, rend
     398             :       integer ix, iy, ipol, ichan, PolnPlane, ConjPlane
     399             :       integer convOrigin
     400             :       integer apol, achan, irow
     401             :       real wt, wtx, wty
     402             :       double precision pi,ts,tc,cfscale,ixr,iyr
     403             :       data pi/3.14159265358979323846/
     404             :       integer ii,jj,iu,iv
     405             : 
     406             :       complex tmp
     407             : 
     408           0 :       irow=rownum
     409             : 
     410           0 :       if(irow.ge.0) then
     411           0 :          rbeg=irow+1
     412           0 :          rend=irow+1
     413             :       else 
     414           0 :          rbeg=1
     415           0 :          rend=nrow
     416             :       end if
     417             : C
     418             : 
     419           0 :       cfscale=1.0
     420           0 :       dPA = -(currentCFPA - actualPA)
     421             : c      dPA=0
     422           0 :       cDPA = cos(dPA)
     423           0 :       sDPA = sin(dPA)
     424           0 :       convOrigin = (convsize+1)/2
     425           0 :       convOrigin = (convsize-1)/2
     426           0 :       convOrigin = (convsize)/2
     427             : 
     428           0 :       do irow=rbeg, rend
     429           0 :          if(rflag(irow).eq.0) then
     430           0 :          do ichan=1, nvischan
     431           0 :             achan=chanmap(ichan)+1
     432             : 
     433           0 :             lambda = c/freq(ichan)
     434             : 
     435           0 :             if((achan.ge.1).and.(achan.le.nchan)) then
     436             :                call spbwproj(uvw(1,irow), dphase(irow), freq(ichan), c,
     437           0 :      $              scale, offset, sampling, pos, loc, off, phasor)
     438           0 :                iloc(3)=max(1, min(wconvsize, loc(3)))
     439           0 :                rsupport=support(iloc(3),1,paindex)
     440             : c$$$               off(1)=0
     441             : c$$$               off(2)=0
     442           0 :                if (opbwproj(nx, ny, wconvsize, loc, rsupport)) then
     443           0 :                   PolnPlane=0
     444             :                   if (ant1(irow).eq. 1 .and.
     445             :      $                 ant2(irow).eq. 2) then
     446             : c$$$                     write(*,*) ichan,off(1), off(2),loc(1),loc(2),
     447             : c$$$     $                    sampling,scale(1),uvw(1,irow),uvw(2,irow)
     448             :                   endif
     449             : 
     450           0 :                   do ipol=1, nvispol
     451           0 :                      apol=polmap(ipol)+1
     452             :                      if((flag(ipol,ichan,irow).ne.1).and.
     453           0 :      $                    (apol.ge.1).and.(apol.le.npol)) then
     454             : 
     455           0 :                         ConjPlane = cfmap(ipol)+1
     456           0 :                         PolnPlane = conjcfmap(ipol)+1
     457             : 
     458           0 :                         nvalue=0.0
     459           0 :                         norm(apol)=cmplx(0.0,0.0)
     460           0 :                         pcwt=cmplx(1.0,0.0)
     461           0 :                         ii=0
     462           0 :                         do iy=-rsupport,rsupport
     463           0 :                            iloc(2)=1+(iy*sampling+off(2))+convOrigin
     464           0 :                            iv = (iy*sampling+off(2))
     465           0 :                            do ix=-rsupport,rsupport
     466           0 :                               iloc(1)=1+(ix*sampling+off(1))+convOrigin
     467           0 :                               iu = (ix*sampling+off(1))
     468             : 
     469             : c$$$                              ixr = ix*sampling*cfscale
     470             : c$$$                              iyr = iy*sampling*cfscale
     471             : c$$$                              iu = nint(cDPA*ixr + sDPA*iyr)
     472             : c$$$                              iv = nint(-sDPA*ixr + cDPA*iyr)
     473             : c$$$                              iu=iu+off(1)*cfscale
     474             : c$$$                              iv=iv+off(2)*cfscale
     475             : 
     476           0 :                               ixr = (ix*sampling+off(1))*cfscale
     477           0 :                               iyr = (iy*sampling+off(2))*cfscale
     478             : c$$$                              iu = nint(cDPA*ixr + sDPA*iyr)
     479             : c$$$                              iv = nint(-sDPA*ixr + cDPA*iyr)
     480           0 :                               iu=ixr
     481           0 :                               iv=iyr
     482           0 :                               ts=0.0
     483           0 :                               tc=1.0
     484           0 :                               ts=sDPA
     485           0 :                               tc=cDPA
     486           0 :                               if(reindex(iu,iv,iloc(1),iloc(2),
     487             :      $                             ts,tc, convOrigin, convSize)) 
     488           0 :      $                             then
     489             : 
     490           0 :                                  if (dopointingcorrection .eq. 1) then
     491             : c$$$                                    iu = iu - off(1)*cfscale
     492             : c$$$                                    iv = iv - off(2)*cfscale
     493             : C
     494             : C     Use the rotated CF co-oridinates to compute the phase grad.  This
     495             : C     effectively rotates the pointing vector with the PA
     496             : C
     497           0 :                                     iu = iloc(1)-convOrigin
     498           0 :                                     iv = iloc(2)-convOrigin
     499           0 :                                     griduvw(1)=(iu)/(scale(1)*sampling)
     500           0 :                                     griduvw(2)=(iv)/(scale(2)*sampling)
     501           0 :                                     ra1 = raoff(ant1(irow)+1)
     502           0 :                                     ra2 = raoff(ant2(irow)+1)
     503           0 :                                     dec1= decoff(ant1(irow)+1)
     504           0 :                                     dec2= decoff(ant2(irow)+1)
     505             :                                     call nwcppEij(griduvw,area,
     506             :      $                                   ra1,dec1,ra2,dec2,
     507             :      $                                   dograd,pcwt,pdcwt1,pdcwt2,
     508           0 :      $                                   currentCFPA)
     509             :                                  endif
     510             : 
     511             : c$$$                                 if(uvw(3,irow).gt.0.0) then
     512             : c$$$                                    cwt=conjg(convfunc(iloc(1),
     513             : c$$$     $                                   iloc(2), iloc(3),ConjPlane))
     514             : c$$$                                    pcwt = conjg(pcwt)
     515             : 
     516             : 
     517             : c$$$                                 else
     518             : c$$$                                    cwt=(convfunc(iloc(1),
     519             : c$$$     $                                   iloc(2), iloc(3),PolnPlane))
     520             : c$$$c                                    pcwt = conjg(pcwt)
     521             : c$$$                                 endif
     522             :                                  cwt=(convfunc(iloc(1),
     523           0 :      $                                iloc(2), iloc(3),PolnPlane))
     524             : 
     525             :                                  nvalue=nvalue+(cwt)*(pcwt)*
     526           0 :      $                              grid(loc(1)+ix,loc(2)+iy,apol,achan)
     527           0 :                                  norm(apol)=norm(apol)+(pcwt*cwt)
     528             : c                               ii=ii+1
     529             : c                                 if (irow .eq. 2) then
     530             : c$$$                                 tmp=grid(loc(1)+ix,loc(2)+iy,
     531             : c$$$     $                                apol,achan)
     532             : c$$$                                 if (ant1(irow) .eq. 1 .and.
     533             : c$$$     $                                ant2(irow) .eq. 2) then
     534             : c$$$                                    write(*,*)abs(nvalue),
     535             : c$$$     $                                   atan2(imag(nvalue),
     536             : c$$$     $                                   real(nvalue)),
     537             : c$$$     $                                   abs(tmp),
     538             : c$$$     $                                   atan2(imag(tmp),real(tmp)),
     539             : c$$$     $                                   ix,iy,
     540             : c$$$     $                                   iloc(1), iloc(2),
     541             : c$$$     $                                   abs(cwt),
     542             : c$$$     $                                   norm(apol),
     543             : c$$$     $                                   ant1(irow),ant2(irow),
     544             : c$$$     $                                   irow,achan,apol,
     545             : c$$$     $                                   off(1), off(2)
     546             : c$$$                                 endif
     547             :                               endif
     548             :                            end do
     549             : c$$$                           write(*,*)
     550             :                         end do
     551             : c                        norm(apol) = norm(apol)/abs(norm(apol))
     552             : c$$$                        write (*,*) nvalue, norm(apol)
     553             :                         values(ipol,ichan,irow)=
     554             :      $                       nvalue*conjg(phasor)
     555           0 :      $                       /norm(apol)
     556             : c$$$                    if ((ant1(irow).eq.1).and.
     557             : c$$$     $                       (ant2(irow).eq.2)) then
     558             : c$$$                           write(*,*) irow,apol,ipol,
     559             : c$$$     $                          abs(values(ipol,ichan,irow)),
     560             : c$$$     $                          atan2(imag(values(ipol,ichan,irow)),
     561             : c$$$     $                          real(values(ipol,ichan,irow)))*57.2956,
     562             : c$$$     $                          real(norm(apol)),imag(norm(apol)),ii
     563             : c$$$                        endif
     564             :                      end if
     565             :                   end do
     566             : c$$$                  write(*,*) "====================================="
     567             : c$$$                  stop
     568             :                end if
     569             :             end if
     570             :          end do
     571             :          end if
     572             :       end do
     573           0 :       return
     574             :       end
     575             : C
     576             : C Degrid a number of visibility records along with the grad. computations
     577             : C
     578           0 :       subroutine dpbwgrad (uvw, dphase, values, nvispol, nvischan,
     579           0 :      $     gazvalues, gelvalues, doconj,
     580           0 :      $     flag, rflag, nrow, rownum, scale, offset, grid, 
     581           0 :      $     nx, ny, npol, nchan, freq, c, support, convsize, sampling, 
     582           0 :      $     wconvsize, convfunc, chanmap, polmap,polused,ant1,ant2,nant, 
     583           0 :      $     scanno, sigma, raoff, decoff,area,dograd,
     584           0 :      $     dopointingcorrection,npa,paindex,cfmap,conjcfmap,
     585             :      $     currentCFPA,actualPA,cfRefFreq)
     586             : 
     587             :       implicit none
     588             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow,polused
     589             :       integer npa,paindex,doconj
     590             :       integer convsize, wconvsize, sampling
     591             :       complex values(nvispol, nvischan, nrow)
     592             :       complex gazvalues(nvispol, nvischan, nrow)
     593             :       complex gelvalues(nvispol, nvischan, nrow)
     594             :       complex grid(nx, ny, npol, nchan)
     595             :       double precision uvw(3, nrow), freq(nvischan), c, scale(3),
     596             :      $     offset(3),currentCFPA,actualPA, dPA, sDPA, cDPA,cfRefFreq
     597             :       double precision dphase(nrow), uvdist
     598             :       complex phasor
     599             :       integer flag(nvispol, nvischan, nrow)
     600             :       integer rflag(nrow),cfmap(npol),conjcfmap(npol)
     601             :       integer rownum
     602             :       integer support(wconvsize,polused,npa), rsupport
     603             :       integer chanmap(*), polmap(*)
     604             : 
     605             :       integer nant, scanno, ant1(nrow), ant2(nrow),dograd,
     606             :      $     dopointingcorrection
     607             :       real raoff(2,1,nant), decoff(2,1,nant)
     608             :       double precision sigma,area,lambda
     609             : 
     610             :       complex nvalue,ngazvalue,ngelvalue
     611             : 
     612             : C      complex convfunc(convsize/2-1, convsize/2-1, wconvsize, polused),
     613             :       complex convfunc(convsize, convsize, wconvsize, polused),
     614             :      $     cwt, pcwt,pdcwt1,pdcwt2
     615             :       double precision griduvw(2)
     616             :       double precision mysigma, ra1,ra2,dec1,dec2
     617             : 
     618             :       complex norm(4),gradaznorm(4),gradelnorm(4)
     619             : 
     620             :       logical opbwproj,reindex
     621             :       external nwcppEij
     622             : 
     623             :       real pos(3)
     624             :       integer loc(3), off(3), iloc(3)
     625             :       integer rbeg, rend
     626             :       integer ix, iy, ipol, ichan, PolnPlane, ConjPlane
     627             :       integer convOrigin
     628             :       integer apol, achan, irow
     629             :       real wt, wtx, wty
     630             :       double precision pi,ts,tc,cfscale,ixr,iyr
     631             :       data pi/3.14159265358979323846/
     632             :       integer ii,iu,iv,tt
     633             : 
     634             :       complex tmp
     635           0 :       tt=0
     636           0 :       irow=rownum
     637             : 
     638           0 :       if(irow.ge.0) then
     639           0 :          rbeg=irow+1
     640           0 :          rend=irow+1
     641             :       else 
     642           0 :          rbeg=1
     643           0 :          rend=nrow
     644             :       end if
     645             : C
     646             : 
     647           0 :       cfscale=1.0
     648           0 :       dPA = -(currentCFPA - actualPA)
     649             : c      dPA = 0
     650           0 :       cDPA = cos(dPA)
     651           0 :       sDPA = sin(dPA)
     652             : c      convOrigin = (convsize+1)/2
     653           0 :       convOrigin = (convsize-1)/2
     654           0 :       convOrigin = (convsize)/2
     655             : 
     656           0 :       do irow=rbeg, rend
     657           0 :          if(rflag(irow).eq.0) then
     658           0 :          do ichan=1, nvischan
     659           0 :             achan=chanmap(ichan)+1
     660             : 
     661           0 :             lambda = c/freq(ichan)
     662             : 
     663           0 :             if((achan.ge.1).and.(achan.le.nchan)) then
     664             :                call spbwproj(uvw(1,irow), dphase(irow), freq(ichan), c,
     665           0 :      $              scale, offset, sampling, pos, loc, off, phasor)
     666           0 :                iloc(3)=max(1, min(wconvsize, loc(3)))
     667           0 :                rsupport=support(iloc(3),1,paindex)
     668           0 :                if (opbwproj(nx, ny, wconvsize, loc, rsupport)) then
     669             : 
     670           0 :                   do ipol=1, nvispol
     671           0 :                      apol=polmap(ipol)+1
     672             :                      if((flag(ipol,ichan,irow).ne.1).and.
     673           0 :      $                    (apol.ge.1).and.(apol.le.npol)) then
     674           0 :                         ConjPlane = conjcfmap(ipol)+1
     675           0 :                         PolnPlane = cfmap(ipol)+1
     676           0 :                         ConjPlane = cfmap(ipol)+1
     677           0 :                         PolnPlane = conjcfmap(ipol)+1
     678           0 :                         nvalue=0.0
     679           0 :                         ngazvalue = 0.0
     680           0 :                         ngelvalue = 0.0
     681             : 
     682           0 :                         norm(apol)=cmplx(0.0,0.0)
     683           0 :                         gradaznorm(apol)=cmplx(0.0,0.0)
     684           0 :                         gradelnorm(apol)=cmplx(0.0,0.0)
     685           0 :                         pcwt=cmplx(1.0,0.0)
     686             : 
     687           0 :                         do iy=-rsupport,rsupport
     688           0 :                            iloc(2)=1+(iy*sampling+off(2))+convOrigin
     689           0 :                            iv=(iy*sampling+off(2))
     690           0 :                            do ix=-rsupport,rsupport
     691           0 :                               iloc(1)=1+(ix*sampling+off(1))+convOrigin
     692           0 :                               iu=(ix*sampling+off(1))
     693             :                               
     694           0 :                               ixr = (ix*sampling+off(1))*cfscale
     695           0 :                               iyr = (iy*sampling+off(2))*cfscale
     696           0 :                               ts=sDPA
     697           0 :                               tc=cDPA
     698           0 :                               iu=ixr
     699           0 :                               iv=iyr
     700           0 :                               if(reindex(iu,iv,iloc(1),iloc(2),
     701             :      $                             ts,tc, convOrigin, convSize)) 
     702             : c$$$                              if(reindex(ixr,iyr,iloc(1),iloc(2),
     703             : c$$$     $                             ts,tc, convOrigin, convSize)) 
     704           0 :      $                             then
     705           0 :                                  if (dopointingcorrection .eq. 1) then
     706             : c$$$                                    iu=iu-off(1)*cfscale
     707             : c$$$                                    iv=iv-off(2)*cfscale
     708             : C
     709             : C     Use the rotated CF co-oridinates to compute the phase grad.  This
     710             : C     effectively rotates the pointing vector with the PA
     711             : C
     712           0 :                                     iu=iloc(1)-convOrigin
     713           0 :                                     iv=iloc(2)-convOrigin
     714           0 :                                     griduvw(1)=(iu)/(scale(1)*sampling)
     715           0 :                                     griduvw(2)=(iv)/(scale(2)*sampling)
     716           0 :                                     ii = PolnPlane
     717             : c                                    ii=apol
     718           0 :                                     ra1 = raoff(ii,1,ant1(irow)+1)
     719           0 :                                     ra2 = raoff(ii,1,ant2(irow)+1)
     720           0 :                                     dec1= decoff(ii,1,ant1(irow)+1)
     721           0 :                                     dec2= decoff(ii,1,ant2(irow)+1)
     722             :                                     call nwcppEij(griduvw,area,
     723             :      $                                   ra1,dec1,ra2,dec2,
     724             :      $                                   dograd,pcwt,pdcwt1,pdcwt2,
     725           0 :      $                                   currentCFPA)
     726             :                                  endif
     727             : c$$$                                 if(uvw(3,irow).gt.0.0) then
     728             : c$$$                                    cwt=conjg(convfunc(iloc(1),
     729             : c$$$     $                                   iloc(2), iloc(3),ConjPlane))
     730             : c$$$                                pcwt = conjg(pcwt)
     731             : c$$$                                    pdcwt1 = conjg(pdcwt1)
     732             : c$$$                                    pdcwt2 = conjg(pdcwt2)
     733             : c$$$                                 else
     734             : c$$$                                    cwt=(convfunc(iloc(1),
     735             : c$$$     $                                   iloc(2), iloc(3),PolnPlane))
     736             : c$$$                                 endif
     737             :                                  cwt=(convfunc(iloc(1),
     738           0 :      $                                iloc(2), iloc(3),PolnPlane))
     739             :                                  
     740           0 :                                  cwt = cwt*pcwt
     741             :                                  nvalue=nvalue+(cwt)*
     742             :      $                                grid(loc(1)+ix,loc(2)+iy,apol,
     743           0 :      $                                achan)
     744             :                                  
     745           0 :                                  if ((doconj .eq. 1) .and. 
     746             :      $                                (dograd .eq. 1)) then
     747           0 :                                     pdcwt1 = conjg(pdcwt1)
     748           0 :                                     pdcwt2 = conjg(pdcwt2)
     749             :                                  endif
     750           0 :                                  if (dograd .eq. 1) then
     751           0 :                                     pdcwt1 = pdcwt1*cwt
     752           0 :                                     pdcwt2 = pdcwt2*cwt
     753             :                                     ngazvalue=ngazvalue+(pdcwt1)*
     754             :      $                                   (grid(loc(1)+ix,loc(2)+iy,
     755           0 :      $                                   apol,achan))
     756             :                                     ngelvalue=ngelvalue+(pdcwt2)*
     757             :      $                                   (grid(loc(1)+ix,loc(2)+iy,
     758           0 :      $                                   apol,achan))
     759             :                                  endif
     760             :                                  
     761           0 :                                  norm(apol)=norm(apol)+(cwt)
     762             :                                  gradaznorm(apol)=gradaznorm(apol)+
     763           0 :      $                                pdcwt1
     764             :                                  gradelnorm(apol)=gradelnorm(apol)+
     765           0 :      $                                pdcwt1
     766             : c$$$                              if (apol .eq. 1) then
     767             : c$$$                              write(*,*)ix,iy,
     768             : c$$$     $                             abs(cwt),atan2(imag(cwt),real(cwt)),
     769             : c$$$     $                             abs(pdcwt1),
     770             : c$$$     $                             atan2(imag(pdcwt1),real(pdcwt1)),
     771             : c$$$     $                             abs(pdcwt2),
     772             : c$$$     $                             atan2(imag(pdcwt2),real(pdcwt2))
     773             : c$$$                              endif
     774             :                               endif
     775             :                            end do
     776             : c$$$                              write(*,*)
     777             :                         end do
     778             : c                        norm(apol) = norm(apol)/abs(norm(apol))
     779             :                         values(ipol,ichan,irow)=
     780             :      $                       nvalue*conjg(phasor)
     781           0 :      $                       /norm(apol)
     782             : c$$$                        if (ant1(irow) .eq. 3 .and.
     783             : c$$$     $                       ant2(irow) .eq. 7) then
     784             : c$$$                           write(*,*)irow,ant1(irow),
     785             : c$$$     $                          ant2(irow),ipol,ichan,
     786             : c$$$     $                          values(ipol,ichan,irow)
     787             : c$$$                           stop
     788             : c$$$                        endif
     789           0 :                         if (dograd .eq. 1) then
     790             :                            gazvalues(ipol,ichan,irow)=ngazvalue*
     791           0 :      $                          conjg(phasor)/norm(apol)
     792             : C     $                          conjg(phasor)/gradaznorm(apol)
     793             :                            gelvalues(ipol,ichan,irow)=ngelvalue*
     794           0 :      $                          conjg(phasor)/norm(apol)
     795             : C     $                          conjg(phasor)/gradelnorm(apol)
     796             :                         endif
     797             :                      end if
     798             :                   end do
     799           0 :                   tt=0
     800             : c$$$                  stop
     801             :                end if
     802             :             end if
     803             :          end do
     804             :          end if
     805             :       end do
     806           0 :       return
     807             :       end
     808             : C
     809             : C Calculate gridded coordinates and the phasor needed for
     810             : C phase rotation. 
     811             : C
     812           0 :       subroutine spbwproj (uvw, dphase, freq, c, scale, offset, 
     813             :      $     sampling, pos, loc, off, phasor)
     814             :       implicit none
     815             :       integer loc(3), off(3), sampling
     816             :       double precision uvw(3), freq, c, scale(3), offset(3)
     817             :       real pos(3)
     818             :       double precision dphase, phase
     819             :       complex phasor
     820             :       integer idim
     821             :       double precision pi
     822             :       data pi/3.14159265358979323846/
     823             : 
     824             : C      pos(3)=(scale(3)*uvw(3)*freq/c)*(scale(3)*uvw(3)*freq/c)
     825             : C     $     +offset(3)+1.0
     826             : C      pos(3)=(scale(3)*uvw(3)*freq/c)+offset(3)+1.0
     827           0 :       pos(3)=sqrt(abs(scale(3)*uvw(3)*freq/c))+offset(3)+1.0
     828           0 :       loc(3)=nint(pos(3))
     829           0 :       off(3)=0
     830             : 
     831           0 :       do idim=1,2
     832             :          pos(idim)=scale(idim)*uvw(idim)*freq/c+
     833           0 :      $        (offset(idim)+1.0)
     834           0 :          loc(idim)=nint(pos(idim))
     835           0 :          off(idim)=nint((loc(idim)-pos(idim))*sampling)
     836             :       end do
     837             : 
     838           0 :       phase=-2.0D0*pi*dphase*freq/c
     839           0 :       phasor=cmplx(cos(phase), sin(phase))
     840           0 :       return 
     841             :       end
     842           0 :       logical function opbwproj (nx, ny, nw, loc, support)
     843             :       implicit none
     844             :       integer nx, ny, nw, loc(3), support
     845             :       opbwproj=(support.gt.0).and.
     846             :      $     (loc(1)-support.ge.1).and.(loc(1)+support.le.nx).and.
     847             :      $     (loc(2)-support.ge.1).and.(loc(2)+support.le.ny).and.
     848           0 :      $     (loc(3).ge.1).and.(loc(3).le.nw)
     849           0 :       return
     850             :       end
     851             : 
     852           0 :       logical function reindex(inx,iny,outx,outy,sinDPA,cosDPA,
     853             :      $     Origin, Size)
     854             :       integer inx,iny,outx,outy, Origin, Size
     855             :       double precision sinDPA, cosDPA
     856             :       integer ix,iy
     857             :       
     858           0 :       ix = nint(cosDPA*inx + sinDPA*iny)+1
     859           0 :       iy = nint(-sinDPA*inx + cosDPA*iny)+1
     860             : c$$$      ix = nint(cosDPA*inx + sinDPA*iny)
     861             : c$$$      iy = nint(-sinDPA*inx + cosDPA*iny)
     862           0 :       outx = ix+Origin
     863           0 :       outy = iy+Origin
     864             : 
     865             : c$$$      outx=ix
     866             : c$$$      outy=iy
     867             :       reindex=(outx .ge. 1 .and. 
     868             :      $     outx .le. Size .and.
     869             :      $     outy .ge. 1 .and.
     870           0 :      $     outy .le. Size)
     871             :       
     872           0 :       return
     873             :       end

Generated by: LCOV version 1.16