LCOV - code coverage report
Current view: top level - synthesis/fortran - fmosaic.f (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 665 0.0 %
Date: 2024-10-09 13:55:54 Functions: 0 17 0.0 %

          Line data    Source code
       1             : 
       2             : *=======================================================================
       3             : *     Copyright (C) 1999-2013
       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: casa-feedback@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$
      29             : *-----------------------------------------------------------------------
      30             : C
      31             : C Grid a number of visibility records
      32             : C
      33           0 :             subroutine gmosd (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, convfunc, 
      37           0 :      $     chanmap, polmap,
      38           0 :      $     sumwt, weightgrid, convweight, doweightgrid, convplanemap, 
      39             :      $     nconvplane)
      40             : 
      41             :       implicit none
      42             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow
      43             :       complex values(nvispol, nvischan, nrow)
      44             :       double complex grid(nx, ny, npol, nchan)
      45             :      
      46             :       double precision uvw(3, nrow), freq(nvischan), c, scale(2),
      47             :      $     offset(2)
      48             :       double precision dphase(nrow), uvdist
      49             :       double precision xlast, ylast
      50             :       complex phasor
      51             :       integer flag(nvispol, nvischan, nrow)
      52             :       integer rflag(nrow)
      53             :       real weight(nvischan, nrow), phase
      54             :       double precision sumwt(npol, nchan)
      55             :       integer rownum
      56             :       integer support
      57             :       integer chanmap(nchan), polmap(npol)
      58             :       integer dopsf
      59             :       double complex weightgrid(nx, ny, npol, nchan)
      60             :       integer doweightgrid
      61             : 
      62             :       double complex nvalue
      63             :       double complex nweight
      64             :       integer convsize, sampling
      65             :       integer nconvplane
      66             :       integer convplanemap(nrow)
      67             :       complex convfunc(convsize, convsize, nconvplane), cwt, crot
      68             :       complex convweight(convsize, convsize, nconvplane)
      69             :       integer sampsupp
      70             :       
      71             : 
      72             :       complex sconv(-sampling*(support+1):sampling*(support+1), 
      73           0 :      $     -sampling*(support+1):sampling*(support+1), nconvplane)
      74             :       complex sconv2(-sampling*(support+1):sampling*(support+1), 
      75           0 :      $     -sampling*(support+1):sampling*(support+1), nconvplane)
      76             :       real sumsconv
      77             :       real sumsconv2
      78             :       real ratioofbeam
      79             : 
      80             :       real norm
      81             :       real wt
      82             : 
      83             :       logical omos, doshift
      84             : 
      85             :       real pos(3)
      86             :       integer loc(2), off(2), iloc(2)
      87             :       integer iiloc(2)
      88             :       integer rbeg, rend
      89             :       integer ix, iy, iz, ipol, ichan
      90             :       integer apol, achan, aconvplane, irow
      91             :       double precision pi
      92             :       data pi/3.14159265358979323846/
      93             :       real maxsconv2, minsconv2
      94           0 :       sampsupp=(support+1)*sampling
      95           0 :       irow=rownum
      96             : 
      97           0 :       sumsconv=0
      98           0 :       sumsconv2=0
      99           0 :       ratioofbeam=1.0
     100             : 
     101             : CCCCCCCCCCCCCCCCCCCCCCCC
     102             : C     minsconv2=1e17
     103             : C      maxsconv2=0.0
     104             : CCCCCCCCCCCCCCCCCCCCCCCC     
     105             : C      write(*,*) scale, offset
     106           0 :       do iz=1, nconvplane
     107           0 :          do iy=-sampsupp,sampsupp
     108           0 :             iloc(2)=iy+(convsize)/2+1
     109           0 :             do ix=-sampsupp,sampsupp
     110           0 :                iloc(1)=ix+(convsize)/2+1
     111           0 :                sconv(ix,iy,iz)=(convfunc(iloc(1), iloc(2),iz))
     112           0 :                sconv2(ix,iy,iz)=convweight(iloc(1), iloc(2),iz)
     113             : C               if(maxsconv2 .lt. abs(sconv2(ix, iy, iz))) then
     114             : C                  maxsconv2=abs(sconv2(ix, iy, iz))
     115             : C               end if 
     116             : C               if(minsconv2 .gt. abs(sconv2(ix, iy, iz))) then
     117             : C                  minsconv2=abs(sconv2(ix, iy, iz))
     118             : C               end if 
     119             :             end do
     120             :          end do
     121             :       end do
     122             : 
     123           0 :       doshift=.FALSE.
     124             : 
     125           0 :       if(irow.ge.0) then
     126           0 :          rbeg=irow+1
     127           0 :          rend=irow+1
     128             :       else 
     129           0 :          rbeg=1
     130           0 :          rend=nrow
     131             :       end if
     132             : 
     133             : C      write(*,*) 'max of sconvs ', maxsconv2, minsconv2, sampsupp, 
     134             : C     $     convsize 
     135             : 
     136             : 
     137             : 
     138           0 :       xlast=0.0
     139           0 :       ylast=0.0
     140           0 :       do irow=rbeg, rend
     141           0 :          aconvplane=convplanemap(irow)+1
     142           0 :          if(rflag(irow).eq.0) then 
     143           0 :             do ichan=1, nvischan
     144           0 :                achan=chanmap(ichan)+1
     145           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
     146           0 :      $              (weight(ichan,irow).ne.0.0)) then
     147             :                   call smos(uvw(1,irow), dphase(irow), freq(ichan), c, 
     148           0 :      $                 scale, offset, sampling, pos, loc, off, phasor)
     149           0 :                   if (omos(nx, ny, loc, support)) then
     150           0 :                      do ipol=1, nvispol
     151           0 :                         apol=polmap(ipol)+1
     152             :                         if((flag(ipol,ichan,irow).ne.1).and.
     153           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
     154             : C     If we are making a PSF then we don't want to phase
     155             : C     rotate but we do want to reproject uvw
     156           0 :                            if(dopsf.eq.1) then
     157           0 :                               nvalue=cmplx(weight(ichan,irow))
     158             :                            else
     159             :                               nvalue=weight(ichan,irow)*
     160           0 :      $                             (values(ipol,ichan,irow)*phasor)
     161             :                            end if
     162           0 :                            if(doweightgrid .gt. 0) then
     163           0 :                               nweight=cmplx(weight(ichan,irow))
     164             :                            end if
     165             :                            
     166             : C     norm will be the value we would get for the peak
     167             : C     at the phase center. We will want to normalize 
     168             : C     the final image by this term.
     169           0 :                            norm=0.0
     170           0 :                            if(sampling.eq.1) then
     171           0 :                               do iy=-support,support
     172           0 :                                  do ix=-support,support
     173             :                                     grid(loc(1)+ix,
     174             :      $                                   loc(2)+iy,apol,achan)=
     175             :      $                                   grid(loc(1)+ix,
     176             :      $                                   loc(2)+iy,apol,achan)+
     177           0 :      $                                   nvalue*sconv(ix,iy, aconvplane)
     178             : 
     179           0 :                                     if(doweightgrid .gt. 0) then
     180           0 :                                        iloc(1)=nx/2+1+ix
     181           0 :                                        iloc(2)=ny/2+1+iy
     182             :                                        weightgrid(iloc(1),iloc(2),
     183             :      $                                  apol,achan)= weightgrid(
     184             :      $                                  iloc(1),iloc(2),apol,achan)
     185           0 :      $                               + nweight*sconv2(ix,iy,aconvplane)
     186             : 
     187             :                                     end if
     188             :                                  end do
     189             :                               end do
     190             :                            else 
     191             : C                              write(*,*)off
     192           0 :                               do iy=-support, support
     193           0 :                                  iloc(2)=(sampling*iy)+off(2)
     194           0 :                                  do ix=-support, support
     195           0 :                                     iloc(1)=(sampling*ix)+off(1)
     196             :                                     cwt=sconv(iloc(1),
     197           0 :      $                                   iloc(2),aconvplane)
     198             : C                          write(*,*) support, iloc 
     199             :                                     grid(loc(1)+ix,
     200             :      $                                   loc(2)+iy,apol,achan)=
     201             :      $                                   grid(loc(1)+ix,
     202             :      $                                   loc(2)+iy,apol,achan)+
     203           0 :      $                                   nvalue*cwt
     204           0 :                                     if(doweightgrid .gt. 0) then
     205             :                                        cwt=sconv2(sampling*ix, 
     206             :      $                                  sampling*iy, 
     207           0 :      $                                      aconvplane)
     208           0 :                                        iiloc(1)=nx/2+1+ix
     209           0 :                                        iiloc(2)=ny/2+1+iy
     210             :                                        weightgrid(iiloc(1),iiloc(2),
     211             :      $                                      apol,achan)= weightgrid(
     212             :      $                                   iiloc(1),iiloc(2),apol,achan)
     213           0 :      $                                + nweight*cwt
     214             : 
     215             :                                     end if
     216             :                                  end do
     217             :                               end do
     218             :                            end if  
     219             :                            sumwt(apol, achan)= sumwt(apol,achan)+
     220           0 :      $                             weight(ichan,irow)
     221             :                         end if
     222             :                      end do
     223             :                   end if
     224             :                end if
     225             :             end do
     226             :          end if
     227             :       end do
     228           0 :       return
     229             :       end
     230             : C
     231             : 
     232           0 :            subroutine gmosd2 (uvw, dphase, values, nvispol, nvischan,
     233           0 :      $     dopsf, flag, rflag, weight, nrow, rownum,
     234           0 :      $     scale, offset, grid, nx, ny, npol, nchan, freq, c,
     235           0 :      $     support, convsize, sampling, convfunc, 
     236           0 :      $     chanmap, polmap,
     237           0 :      $     sumwt, weightgrid, convweight, doweightgrid, convplanemap, 
     238           0 :      $     convchanmap, convpolmap, 
     239             :      $     nconvplane, nconvchan, nconvpol)
     240             : 
     241             :       implicit none
     242             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow
     243             :       complex values(nvispol, nvischan, nrow)
     244             :       double complex grid(nx, ny, npol, nchan)
     245             :      
     246             :       double precision uvw(3, nrow), freq(nvischan), c, scale(2),
     247             :      $     offset(2)
     248             :       double precision dphase(nrow), uvdist
     249             :       double precision xlast, ylast
     250             :       complex phasor
     251             :       integer flag(nvispol, nvischan, nrow)
     252             :       integer rflag(nrow)
     253             :       real weight(nvischan, nrow), phase
     254             :       double precision sumwt(npol, nchan)
     255             :       integer rownum
     256             :       integer support
     257             :       integer chanmap(nchan), polmap(npol)
     258             :       integer dopsf
     259             :       double complex weightgrid(nx, ny, npol, nchan)
     260             :       integer doweightgrid
     261             : 
     262             :       double complex nvalue
     263             :       double complex nweight
     264             :       integer convsize, sampling
     265             :       integer nconvplane, nconvchan, nconvpol
     266             :       integer convplanemap(nrow)
     267             :       integer convchanmap(nvischan)
     268             :       integer convpolmap(nvispol)
     269             :       complex convfunc(convsize, convsize, nconvpol, nconvchan, 
     270             :      $ nconvplane), cwt, crot
     271             :       complex convweight(convsize, convsize, nconvpol, nconvchan, 
     272             :      $ nconvplane)
     273             :       integer sampsupp
     274             :       
     275             : 
     276             :       complex sconv(-sampling*(support+1):sampling*(support+1), 
     277             :      $     -sampling*(support+1):sampling*(support+1), nconvplane)
     278             :       complex sconv2(-sampling*(support+1):sampling*(support+1), 
     279             :      $     -sampling*(support+1):sampling*(support+1), nconvplane)
     280             :       real sumsconv
     281             :       real sumsconv2
     282             :       real ratioofbeam
     283             : 
     284             :       real norm
     285             :       real wt
     286             : 
     287             :       logical omos, doshift
     288             : 
     289             :       real pos(3)
     290             :       integer loc(2), off(2), iloc(2)
     291             :       integer iiloc(2)
     292             :       integer rbeg, rend
     293             :       integer ix, iy, iz, ipol, ichan, xind, yind
     294             :       integer apol, achan, aconvplane, irow
     295             :       integer aconvpol, aconvchan, xind2, yind2
     296             :       double precision pi
     297             :       data pi/3.14159265358979323846/
     298             :       real maxsconv2, minsconv2
     299           0 :       sampsupp=(support+1)*sampling
     300           0 :       irow=rownum
     301             : 
     302           0 :       sumsconv=0
     303           0 :       sumsconv2=0
     304           0 :       ratioofbeam=1.0
     305             : 
     306             : CCCCCCCCCCCCCCCCCCCCCCCC
     307             : C     minsconv2=1e17
     308             : C      maxsconv2=0.0
     309             : CCCCCCCCCCCCCCCCCCCCCCCC     
     310             : C      write(*,*) scale, offset
     311             : C      do iz=1, nconvplane
     312             : C         do ichan=1, nconvchan
     313             : C            do ipol=1, nconvpol
     314             : C               do iy=-sampsupp,sampsupp
     315             : C                  iloc(2)=iy+(convsize)/2+1
     316             : C                  do ix=-sampsupp,sampsupp
     317             : C                     iloc(1)=ix+(convsize)/2+1
     318             : C                     sconv(ix,iy,iz)=(convfunc(iloc(1), iloc(2),ipol, 
     319             : C     $                ichan, iz))
     320             : C                     sconv2(ix,iy,iz)=convweight(iloc(1), iloc(2),iz)
     321             : CC               if(maxsconv2 .lt. abs(sconv2(ix, iy, iz))) then
     322             : CC                  maxsconv2=abs(sconv2(ix, iy, iz))
     323             : CC               end if 
     324             : CC               if(minsconv2 .gt. abs(sconv2(ix, iy, iz))) then
     325             : CC                  minsconv2=abs(sconv2(ix, iy, iz))
     326             : CC               end if 
     327             : C           end do
     328             : C         end do
     329             : C      end do
     330             : 
     331           0 :       doshift=.FALSE.
     332             : 
     333           0 :       if(irow.ge.0) then
     334           0 :          rbeg=irow+1
     335           0 :          rend=irow+1
     336             :       else 
     337           0 :          rbeg=1
     338           0 :          rend=nrow
     339             :       end if
     340             : 
     341             : C      write(*,*) 'max of sconvs ', maxsconv2, minsconv2, sampsupp, 
     342             : C     $     convsize 
     343             : 
     344             : 
     345             : 
     346           0 :       xlast=0.0
     347           0 :       ylast=0.0
     348           0 :       do irow=rbeg, rend
     349           0 :          aconvplane=convplanemap(irow)+1
     350           0 :          if(rflag(irow).eq.0) then 
     351           0 :             do ichan=1, nvischan
     352           0 :                achan=chanmap(ichan)+1
     353           0 :                aconvchan=convchanmap(ichan)+1
     354           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
     355           0 :      $              (weight(ichan,irow).ne.0.0)) then
     356             :                   call smos(uvw(1,irow), dphase(irow), freq(ichan), c, 
     357           0 :      $                 scale, offset, sampling, pos, loc, off, phasor)
     358           0 :                   if (omos(nx, ny, loc, support)) then
     359           0 :                      do ipol=1, nvispol
     360           0 :                         apol=polmap(ipol)+1
     361           0 :                         aconvpol=convpolmap(ipol)+1
     362             :                         if((flag(ipol,ichan,irow).ne.1).and.
     363           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
     364             : C     If we are making a PSF then we don't want to phase
     365             : C     rotate but we do want to reproject uvw
     366           0 :                            if(dopsf.eq.1) then
     367           0 :                               nvalue=cmplx(weight(ichan,irow))
     368             :                            else
     369             :                               nvalue=weight(ichan,irow)*
     370           0 :      $                             (values(ipol,ichan,irow)*phasor)
     371             :                            end if
     372           0 :                            if(doweightgrid .gt. 0) then
     373           0 :                               nweight=cmplx(weight(ichan,irow))
     374             :                            end if
     375             :                            
     376             : C     norm will be the value we would get for the peak
     377             : C     at the phase center. We will want to normalize 
     378             : C     the final image by this term.
     379           0 :                            norm=0.0
     380           0 :                            if(sampling.eq.1) then
     381           0 :                               do iy=-support,support
     382           0 :                                  yind=iy+(convsize)/2+1
     383           0 :                                  do ix=-support,support
     384           0 :                                     xind=ix+(convsize)/2+1
     385             :                                     grid(loc(1)+ix,
     386             :      $                                   loc(2)+iy,apol,achan)=
     387             :      $                                   grid(loc(1)+ix,
     388             :      $                                   loc(2)+iy,apol,achan)+
     389             :      $                                   nvalue*convfunc(xind, yind, 
     390           0 :      $                                  aconvpol, aconvchan, aconvplane)
     391             : 
     392           0 :                                     if(doweightgrid .gt. 0) then
     393           0 :                                        iloc(1)=nx/2+1+ix
     394           0 :                                        iloc(2)=ny/2+1+iy
     395             :                                        weightgrid(iloc(1),iloc(2),
     396             :      $                                  apol,achan)= weightgrid(
     397             :      $                                  iloc(1),iloc(2),apol,achan)
     398             :      $                               + nweight*convweight(xind, yind, 
     399           0 :      $                                  aconvpol, aconvchan, aconvplane)
     400             : 
     401             :                                     end if
     402             :                                  end do
     403             :                               end do
     404             :                            else 
     405             : C                              write(*,*)off
     406           0 :                               do iy=-support, support
     407           0 :                                  iloc(2)=(sampling*iy)+off(2)
     408           0 :                                  yind=iloc(2)+(convsize)/2+1
     409           0 :                                  do ix=-support, support
     410           0 :                                     iloc(1)=(sampling*ix)+off(1)
     411           0 :                                     xind=iloc(1)+(convsize)/2+1
     412             :                                     cwt=convfunc(xind, yind, 
     413           0 :      $                                  aconvpol, aconvchan, aconvplane)
     414             : C                          write(*,*) support, iloc 
     415             :                                     grid(loc(1)+ix,
     416             :      $                                   loc(2)+iy,apol,achan)=
     417             :      $                                   grid(loc(1)+ix,
     418             :      $                                   loc(2)+iy,apol,achan)+
     419           0 :      $                                   nvalue*cwt
     420           0 :                                     if(doweightgrid .gt. 0) then
     421           0 :                                        xind2=sampling*ix+(convsize)/2+1
     422           0 :                                        yind2=sampling*iy+(convsize)/2+1
     423             :                                        cwt=convweight(xind2, 
     424           0 :      $                        yind2, aconvpol, aconvchan, aconvplane)
     425           0 :                                        iiloc(1)=nx/2+1+ix
     426           0 :                                        iiloc(2)=ny/2+1+iy
     427             :                                        weightgrid(iiloc(1),iiloc(2),
     428             :      $                                      apol,achan)= weightgrid(
     429             :      $                                   iiloc(1),iiloc(2),apol,achan)
     430           0 :      $                                + nweight*cwt
     431             : 
     432             :                                     end if
     433             :                                  end do
     434             :                               end do
     435             :                            end if  
     436             :                            sumwt(apol, achan)= sumwt(apol,achan)+
     437           0 :      $                             weight(ichan,irow)
     438             :                         end if
     439             :                      end do
     440             :                   end if
     441             :                end if
     442             :             end do
     443             :          end if
     444             :       end do
     445           0 :       return
     446             :       end
     447             : C
     448             : 
     449           0 :       subroutine gmoswgtd (nvispol, nvischan,
     450           0 :      $     flag, rflag, weight, nrow, 
     451             :      $     nx, ny, npol, nchan, 
     452             :      $     support, convsize, sampling, 
     453           0 :      $     chanmap, polmap,
     454           0 :      $      weightgrid, sumwt, convweight, convplanemap, 
     455           0 :      $     convchanmap, convpolmap, 
     456             :      $     nconvplane, nconvchan, nconvpol, rbeg, 
     457           0 :      $     rend, loc, off, phasor)
     458             : 
     459             :       implicit none
     460             :       integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
     461             :  
     462             :       
     463             :       integer, intent(in)  :: loc(2, nvischan, nrow)
     464             :       integer, intent(in) :: off(2, nvischan, nrow) 
     465             :       complex, intent(in) :: phasor(nvischan, nrow)
     466             :       integer, intent(in) :: flag(nvispol, nvischan, nrow)
     467             :       integer, intent(in) ::  rflag(nrow)
     468             :       real, intent(in) :: weight(nvischan, nrow)
     469             :       integer, intent(in) :: support
     470             :       integer, intent(in) ::  chanmap(nchan), polmap(npol)
     471             :       double complex, intent(inout) ::  weightgrid(nx, ny, npol, nchan)
     472             :       double precision, intent(inout) :: sumwt(npol, nchan)
     473             :       double complex :: nweight
     474             :       integer, intent(in) :: convsize, sampling
     475             :       integer, intent(in) ::  nconvplane, nconvchan, nconvpol
     476             :       integer, intent(in) ::  convplanemap(nrow)
     477             :       integer, intent(in) ::  convchanmap(nvischan)
     478             :       integer, intent(in) ::  convpolmap(nvispol)
     479             :       complex :: cwt
     480             :       complex, intent(in) :: convweight(convsize, convsize, nconvpol, 
     481             :      $     nconvchan, nconvplane)
     482             :       
     483             : 
     484             :       real :: norm
     485             :       real ::  wt
     486             : 
     487             :       logical :: onmosgrid
     488             :       logical :: doconj
     489             :       
     490             :       integer :: iloc(2)
     491             :       integer :: iiloc(2)
     492             :       integer, intent(in) ::  rbeg, rend
     493             :       integer :: ix, iy, iz, ipol, ichan, xind, yind
     494             :       integer :: apol, achan, aconvplane, irow
     495             :       integer :: aconvpol, aconvchan, xind2, yind2
     496             :       integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
     497             :       logical :: centin
     498             : 
     499             :    
     500             : 
     501             : 
     502           0 :       do irow=rbeg, rend
     503           0 :          aconvplane=abs(convplanemap(irow))+1
     504           0 :          doconj = (convplanemap(irow) < 0)
     505           0 :          if(rflag(irow).eq.0) then 
     506           0 :             do ichan=1, nvischan
     507           0 :                achan=chanmap(ichan)+1
     508           0 :                aconvchan=convchanmap(ichan)+1
     509           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
     510           0 :      $              (weight(ichan,irow).ne.0.0)) then
     511           0 :                   if (onmosgrid(loc(1, ichan, irow), nx, ny, 1, 1, 
     512             :      $                 nx, ny, support, msupportx, msupporty,
     513             :      $                 psupportx, psupporty, centin)) then
     514           0 :                      do ipol=1, nvispol
     515           0 :                         apol=polmap(ipol)+1
     516           0 :                         aconvpol=convpolmap(ipol)+1
     517             :                         if((flag(ipol,ichan,irow).ne.1).and.
     518           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
     519             : C     If we are making a PSF then we don't want to phase
     520             : C     rotate but we do want to reproject uvw
     521             :                           
     522             :                            
     523           0 :                            nweight=cmplx(weight(ichan,irow))
     524             :                            sumwt(apol, achan)=sumwt(apol, achan)+
     525           0 :      $                          weight(ichan, irow)
     526             :                            
     527             : C     norm will be the value we would get for the peak
     528             : C     at the phase center. We will want to normalize 
     529             : C     the final image by this term.
     530           0 :                            norm=0.0
     531             : C     write(*,*)off
     532           0 :                            do iy=msupporty, psupporty
     533           0 :                                  do ix=msupportx, psupportx
     534             :                                    
     535           0 :                                        xind2=sampling*ix+(convsize)/2+1
     536           0 :                                        yind2=sampling*iy+(convsize)/2+1
     537             :                                        cwt=convweight(xind2, 
     538             :      $                                      yind2, aconvpol,
     539           0 :      $                                  aconvchan, aconvplane)
     540             :                                        
     541           0 :                                        iiloc(1)=nx/2+1+ix
     542           0 :                                        iiloc(2)=ny/2+1+iy
     543             :                                        weightgrid(iiloc(1),iiloc(2),
     544             :      $                                      apol,achan)= weightgrid(
     545             :      $                                   iiloc(1),iiloc(2),apol,achan)
     546           0 :      $                                + nweight*cwt
     547             : 
     548             :                                   
     549             :                                  end do
     550             :                               end do
     551             :                            
     552             :                         end if
     553             :                      end do
     554             :                   end if
     555             :                end if
     556             :             end do
     557             :          end if
     558             :       end do
     559           0 :       return
     560             :       end
     561             : 
     562             : 
     563             : C same as gmoswgtd except with varying support
     564           0 :        subroutine gmoswgtd2 (nvispol, nvischan,
     565           0 :      $     flag, rflag, weight, nrow, 
     566             :      $     nx, ny, npol, nchan, 
     567           0 :      $     supports, convsize, sampling, 
     568           0 :      $     chanmap, polmap,
     569           0 :      $      weightgrid, sumwt, convweight, convplanemap, 
     570           0 :      $     convchanmap, convpolmap, 
     571             :      $     nconvplane, nconvchan, nconvpol, rbeg, 
     572           0 :      $     rend, loc, off, phasor)
     573             : 
     574             :       implicit none
     575             :       integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
     576             :  
     577             :       
     578             :       integer, intent(in)  :: loc(2, nvischan, nrow)
     579             :       integer, intent(in) :: off(2, nvischan, nrow) 
     580             :       complex, intent(in) :: phasor(nvischan, nrow)
     581             :       integer, intent(in) :: flag(nvispol, nvischan, nrow)
     582             :       integer, intent(in) ::  rflag(nrow)
     583             :       real, intent(in) :: weight(nvischan, nrow)
     584             :       
     585             :       integer, intent(in) ::  chanmap(nchan), polmap(npol)
     586             :       double complex, intent(inout) ::  weightgrid(nx, ny, npol, nchan)
     587             :       double precision, intent(inout) :: sumwt(npol, nchan)
     588             :       double complex :: nweight
     589             :       integer, intent(in) :: convsize, sampling
     590             :       integer, intent(in) ::  nconvplane, nconvchan, nconvpol
     591             :       integer, intent(in) ::  convplanemap(nrow)
     592             :       integer, intent(in) ::  convchanmap(nvischan)
     593             :       integer, intent(in) ::  convpolmap(nvispol)
     594             :       complex :: cwt
     595             :       complex, intent(in) :: convweight(convsize, convsize, nconvpol, 
     596             :      $     nconvchan, nconvplane)
     597             :       integer, intent(in) :: supports(nconvplane)
     598             : 
     599             :       real :: norm
     600             :       real ::  wt
     601           0 :       complex :: cfunc(convsize, convsize)
     602             :       logical :: onmosgrid
     603             :       
     604             :       integer :: iloc(2)
     605             :       integer :: iiloc(2)
     606             :       integer, intent(in) ::  rbeg, rend
     607             :       integer :: ix, iy, iz, ipol, ichan, xind, yind
     608             :       integer :: apol, achan, aconvplane, irow
     609             :       integer :: aconvpol, aconvchan, xind2, yind2
     610             :       integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
     611             :       logical :: centin
     612             :       integer :: support
     613             :    
     614             : 
     615             : 
     616           0 :       do irow=rbeg, rend
     617           0 :          aconvplane=abs(convplanemap(irow))+1
     618           0 :          support=supports(aconvplane)
     619           0 :          if(rflag(irow).eq.0) then 
     620           0 :             do ichan=1, nvischan
     621           0 :                achan=chanmap(ichan)+1
     622           0 :                aconvchan=convchanmap(ichan)+1
     623           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
     624           0 :      $              (weight(ichan,irow).ne.0.0)) then
     625           0 :                   if (onmosgrid(loc(1, ichan, irow), nx, ny, 1, 1, 
     626             :      $                 nx, ny, support, msupportx, msupporty,
     627             :      $                 psupportx, psupporty, centin)) then
     628           0 :                      do ipol=1, nvispol
     629           0 :                         apol=polmap(ipol)+1
     630           0 :                         aconvpol=convpolmap(ipol)+1
     631             :                         if((flag(ipol,ichan,irow).ne.1).and.
     632           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
     633             : C     If we are making a PSF then we don't want to phase
     634             : C     rotate but we do want to reproject uvw
     635             :                           
     636             :                            
     637           0 :                            nweight=cmplx(weight(ichan,irow))
     638             :                            sumwt(apol, achan)=sumwt(apol, achan)+
     639           0 :      $                          weight(ichan, irow)
     640             :                            
     641             : C     norm will be the value we would get for the peak
     642             : C     at the phase center. We will want to normalize 
     643             : C     the final image by this term.
     644           0 :                            norm=0.0
     645             : C     write(*,*)off
     646           0 :                cfunc=convweight(:,:,aconvpol, aconvchan, aconvplane)
     647           0 :                            do iy=msupporty, psupporty
     648           0 :                                  do ix=msupportx, psupportx
     649             :                                    
     650           0 :                                        xind2=sampling*ix+(convsize)/2+1
     651           0 :                                        yind2=sampling*iy+(convsize)/2+1
     652             :                                        cwt=cfunc(xind2, 
     653           0 :      $                                      yind2)
     654             :                                        
     655           0 :                                        iiloc(1)=nx/2+1+ix
     656           0 :                                        iiloc(2)=ny/2+1+iy
     657             :                                        weightgrid(iiloc(1),iiloc(2),
     658             :      $                                      apol,achan)= weightgrid(
     659             :      $                                   iiloc(1),iiloc(2),apol,achan)
     660           0 :      $                                + nweight*cwt
     661             : 
     662             :                                   
     663             :                                  end do
     664             :                               end do
     665             :                            
     666             :                         end if
     667             :                      end do
     668             :                   end if
     669             :                end if
     670             :             end do
     671             :          end if
     672             :       end do
     673           0 :       return
     674             :       end
     675             : 
     676             : 
     677             : 
     678             : 
     679             :       
     680             : C Single precision weight grid image...Damn you fortran...no templates
     681           0 :       subroutine gmoswgts (nvispol, nvischan,
     682           0 :      $     flag, rflag, weight, nrow, 
     683             :      $     nx, ny, npol, nchan, 
     684             :      $     support, convsize, sampling, 
     685           0 :      $     chanmap, polmap,
     686           0 :      $      weightgrid, sumwt, convweight, convplanemap, 
     687           0 :      $     convchanmap, convpolmap, 
     688             :      $     nconvplane, nconvchan, nconvpol, rbeg, 
     689           0 :      $     rend, loc, off, phasor)
     690             : 
     691             :       implicit none
     692             :       integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
     693             :  
     694             :       
     695             :       integer, intent(in)  :: loc(2, nvischan, nrow)
     696             :       integer, intent(in) :: off(2, nvischan, nrow) 
     697             :       complex, intent(in) :: phasor(nvischan, nrow)
     698             :       integer, intent(in) :: flag(nvispol, nvischan, nrow)
     699             :       integer, intent(in) ::  rflag(nrow)
     700             :       real, intent(in) :: weight(nvischan, nrow)
     701             :       integer, intent(in) :: support
     702             :       integer, intent(in) ::  chanmap(nchan), polmap(npol)
     703             :       complex, intent(inout) ::  weightgrid(nx, ny, npol, nchan)
     704             :       double precision, intent(inout) :: sumwt(npol, nchan)
     705             :       complex :: nweight
     706             :       integer, intent(in) :: convsize, sampling
     707             :       integer, intent(in) ::  nconvplane, nconvchan, nconvpol
     708             :       integer, intent(in) ::  convplanemap(nrow)
     709             :       integer, intent(in) ::  convchanmap(nvischan)
     710             :       integer, intent(in) ::  convpolmap(nvispol)
     711             :       complex :: cwt
     712             :       complex, intent(in) :: convweight(convsize, convsize, nconvpol, 
     713             :      $     nconvchan, nconvplane)
     714             :       
     715             : 
     716             :       real :: norm
     717             :       real ::  wt
     718             : 
     719             :       logical :: onmosgrid
     720             : 
     721             :       integer :: iloc(2)
     722             :       integer :: iiloc(2)
     723             :       integer, intent(in) ::  rbeg, rend
     724             :       integer :: ix, iy, iz, ipol, ichan, xind, yind
     725             :       integer :: apol, achan, aconvplane, irow
     726             :       integer :: aconvpol, aconvchan, xind2, yind2
     727             :       integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
     728             :       logical :: centin
     729             : 
     730             :    
     731             : 
     732             : 
     733           0 :       do irow=rbeg, rend
     734           0 :          aconvplane=convplanemap(irow)+1
     735           0 :          if(rflag(irow).eq.0) then 
     736           0 :             do ichan=1, nvischan
     737           0 :                achan=chanmap(ichan)+1
     738           0 :                aconvchan=convchanmap(ichan)+1
     739           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
     740           0 :      $              (weight(ichan,irow).ne.0.0)) then
     741           0 :                   if (onmosgrid(loc(1, ichan, irow), nx, ny, 1, 1, 
     742             :      $                 nx, ny, support, msupportx, msupporty,
     743             :      $                 psupportx, psupporty, centin)) then
     744           0 :                      do ipol=1, nvispol
     745           0 :                         apol=polmap(ipol)+1
     746           0 :                         aconvpol=convpolmap(ipol)+1
     747             :                         if((flag(ipol,ichan,irow).ne.1).and.
     748           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
     749             : C     If we are making a PSF then we don't want to phase
     750             : C     rotate but we do want to reproject uvw
     751             :                           
     752             :                            
     753           0 :                            nweight=cmplx(weight(ichan,irow))
     754             :                            sumwt(apol, achan)=sumwt(apol, achan)+
     755           0 :      $                          weight(ichan, irow)
     756             :                            
     757             : C     norm will be the value we would get for the peak
     758             : C     at the phase center. We will want to normalize 
     759             : C     the final image by this term.
     760           0 :                            norm=0.0
     761             : C     write(*,*)off
     762           0 :                            do iy=msupporty, psupporty
     763           0 :                                  do ix=msupportx, psupportx
     764             :                                    
     765           0 :                                        xind2=sampling*ix+(convsize)/2+1
     766           0 :                                        yind2=sampling*iy+(convsize)/2+1
     767             :                                        cwt=convweight(xind2, 
     768           0 :      $                        yind2, aconvpol, aconvchan, aconvplane)
     769           0 :                                        iiloc(1)=nx/2+1+ix
     770           0 :                                        iiloc(2)=ny/2+1+iy
     771             :                                        weightgrid(iiloc(1),iiloc(2),
     772             :      $                                      apol,achan)= weightgrid(
     773             :      $                                   iiloc(1),iiloc(2),apol,achan)
     774           0 :      $                                + nweight*cwt
     775             : 
     776             :                                   
     777             :                                  end do
     778             :                               end do
     779             :                            
     780             :                         end if
     781             :                      end do
     782             :                   end if
     783             :                end if
     784             :             end do
     785             :          end if
     786             :       end do
     787           0 :       return
     788             :       end
     789             : 
     790             : 
     791           0 :       subroutine sectgmosd2 (values, nvispol, nvischan,
     792           0 :      $     dopsf, flag, rflag, weight, nrow, 
     793           0 :      $     grid, nx, ny, npol, nchan, 
     794           0 :      $     support, convsize, sampling, convfunc, 
     795           0 :      $     chanmap, polmap,
     796           0 :      $     sumwt, convplanemap, 
     797           0 :      $     convchanmap, convpolmap, 
     798             :      $     nconvplane, nconvchan, nconvpol, x0, y0, nxsub, nysub, rbeg, 
     799           0 :      $     rend, loc, off, phasor)
     800             : 
     801             :       implicit none
     802             :       integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
     803             :       complex, intent(in) :: values(nvispol, nvischan, nrow)
     804             :       double complex, intent(inout) ::  grid(nx, ny, npol, nchan)
     805             :       
     806             :       integer, intent(in) :: x0, y0, nxsub, nysub
     807             :       integer, intent(in)  :: loc(2, nvischan, nrow)
     808             :       integer, intent(in) :: off(2, nvischan, nrow) 
     809             :       complex, intent(in) :: phasor(nvischan, nrow)
     810             :       integer, intent(in) :: flag(nvispol, nvischan, nrow)
     811             :       integer, intent(in) ::  rflag(nrow)
     812             :       real, intent(in) :: weight(nvischan, nrow)
     813             :       double precision, intent(inout) ::  sumwt(npol, nchan)
     814             :       integer, intent(in) :: support
     815             :       integer, intent(in) ::  chanmap(nchan), polmap(npol)
     816             :       integer,  intent(in) :: dopsf
     817             : 
     818             :       double complex :: nvalue
     819             :       integer, intent(in) :: convsize, sampling
     820             :       integer, intent(in) ::  nconvplane, nconvchan, nconvpol
     821             :       integer, intent(in) ::  convplanemap(nrow)
     822             :       integer, intent(in) ::  convchanmap(nvischan)
     823             :       integer, intent(in) ::  convpolmap(nvispol)
     824             :       complex, intent(in) :: convfunc(convsize, convsize, nconvpol, 
     825             :      $     nconvchan,  nconvplane)
     826             :       complex :: cwt
     827             :       
     828             : 
     829             :       real :: norm
     830             :       real ::  wt
     831             : 
     832             :       logical :: onmosgrid
     833             : 
     834             :       integer :: iloc(2)
     835             :       integer :: iiloc(2)
     836             :       integer, intent(in) ::  rbeg, rend
     837             :       integer :: ix, iy, iz, ipol, ichan, xind, yind
     838             :       integer :: apol, achan, aconvplane, irow
     839             :       integer :: aconvpol, aconvchan, xind2, yind2
     840             :       integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
     841             :       logical :: centin
     842             :       logical :: doconj
     843             :    
     844             : 
     845             : 
     846           0 :       do irow=rbeg, rend
     847             : C     sign of convplanemap determines if to use conjg
     848           0 :          aconvplane=abs(convplanemap(irow))+1
     849           0 :          doconj = (convplanemap(irow) < 0)
     850           0 :          if(rflag(irow).eq.0) then 
     851           0 :             do ichan=1, nvischan
     852           0 :                achan=chanmap(ichan)+1
     853           0 :                aconvchan=convchanmap(ichan)+1
     854           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
     855           0 :      $              (weight(ichan,irow).ne.0.0)) then
     856           0 :                   if (onmosgrid(loc(1, ichan, irow), nx, ny, x0, y0, 
     857             :      $                 nxsub, nysub, support, msupportx, msupporty,
     858             :      $                 psupportx, psupporty, centin)) then
     859           0 :                      do ipol=1, nvispol
     860           0 :                         apol=polmap(ipol)+1
     861           0 :                         aconvpol=convpolmap(ipol)+1
     862             :                         if((flag(ipol,ichan,irow).ne.1).and.
     863           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
     864             : C     If we are making a PSF then we don't want to phase
     865             : C     rotate but we do want to reproject uvw
     866           0 :                            if(dopsf.eq.1) then
     867           0 :                               nvalue=cmplx(weight(ichan,irow))
     868             :                            else
     869             :                               nvalue=weight(ichan,irow)*
     870           0 :      $                  (values(ipol,ichan,irow)*phasor(ichan, irow))
     871             :                            end if
     872             :                           
     873             :                            
     874             : C     norm will be the value we would get for the peak
     875             : C     at the phase center. We will want to normalize 
     876             : C     the final image by this term.
     877           0 :                            norm=0.0
     878           0 :                            do iy=msupporty, psupporty
     879             :                                  iloc(2)=(sampling*iy)+
     880           0 :      $                                off(2, ichan, irow)
     881           0 :                                  yind=iloc(2)+(convsize)/2+1
     882           0 :                                  do ix=msupportx, psupportx
     883             :                                     iloc(1)=(sampling*ix)+
     884           0 :      $                                   off(1, ichan, irow)
     885           0 :                                     xind=iloc(1)+(convsize)/2+1
     886             :                                     cwt=convfunc(xind, yind, 
     887           0 :      $                                aconvpol, aconvchan, aconvplane)
     888           0 :                                     if(doconj) cwt=conjg(cwt)
     889             : C                          write(*,*) support, iloc
     890             : C      write(*,*) loc(1, ichan, irow)+ix,loc(2, ichan, irow)+iy,xind,yind
     891             :                                     grid(loc(1, ichan, irow)+ix,
     892             :      $                           loc(2, ichan, irow)+iy,apol,achan)=
     893             :      $                             grid(loc(1, ichan, irow)+ix,
     894             :      $                           loc(2, ichan, irow)+iy,apol,achan)+
     895           0 :      $                                   nvalue*cwt
     896             :                                  end do
     897             :                               end do
     898           0 :                            if(centin) then
     899             :                               sumwt(apol, achan)= sumwt(apol,achan)+
     900           0 :      $                             weight(ichan,irow)
     901             :                            endif
     902             :                         end if
     903             :                      end do
     904             : C if onmos
     905             :                   end if
     906             :                end if
     907             :             end do
     908             :          end if
     909             :       end do
     910           0 :       return
     911             :       end
     912             : C  Single Precision version
     913           0 :       subroutine sectgmoss2 (values, nvispol, nvischan,
     914           0 :      $     dopsf, flag, rflag, weight, nrow, 
     915           0 :      $     grid, nx, ny, npol, nchan, 
     916           0 :      $     support, convsize, sampling, convfunc, 
     917           0 :      $     chanmap, polmap,
     918           0 :      $     sumwt, convplanemap, 
     919           0 :      $     convchanmap, convpolmap, 
     920             :      $     nconvplane, nconvchan, nconvpol, x0, y0, nxsub, nysub, rbeg, 
     921           0 :      $     rend, loc, off, phasor)
     922             : 
     923             :       implicit none
     924             :       integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
     925             :       complex, intent(in) :: values(nvispol, nvischan, nrow)
     926             :       complex, intent(inout) ::  grid(nx, ny, npol, nchan)
     927             :       
     928             :       integer, intent(in) :: x0, y0, nxsub, nysub
     929             :       integer, intent(in)  :: loc(2, nvischan, nrow)
     930             :       integer, intent(in) :: off(2, nvischan, nrow) 
     931             :       complex, intent(in) :: phasor(nvischan, nrow)
     932             :       integer, intent(in) :: flag(nvispol, nvischan, nrow)
     933             :       integer, intent(in) ::  rflag(nrow)
     934             :       real, intent(in) :: weight(nvischan, nrow)
     935             :       double precision, intent(inout) ::  sumwt(npol, nchan)
     936             :       integer, intent(in) :: support
     937             :       integer, intent(in) ::  chanmap(nchan), polmap(npol)
     938             :       integer,  intent(in) :: dopsf
     939             : 
     940             :       complex :: nvalue
     941             :       integer, intent(in) :: convsize, sampling
     942             :       integer, intent(in) ::  nconvplane, nconvchan, nconvpol
     943             :       integer, intent(in) ::  convplanemap(nrow)
     944             :       integer, intent(in) ::  convchanmap(nvischan)
     945             :       integer, intent(in) ::  convpolmap(nvispol)
     946             :       complex, intent(in) :: convfunc(convsize, convsize, nconvpol, 
     947             :      $     nconvchan,  nconvplane)
     948             :       complex :: cwt
     949             :       
     950             : 
     951             :       real :: norm
     952             :       real ::  wt
     953             : 
     954             :       logical :: onmosgrid
     955             : 
     956             :       integer :: iloc(2)
     957             :       integer :: iiloc(2)
     958             :       integer, intent(in) ::  rbeg, rend
     959             :       integer :: ix, iy, iz, ipol, ichan, xind, yind
     960             :       integer :: apol, achan, aconvplane, irow
     961             :       integer :: aconvpol, aconvchan, xind2, yind2
     962             :       integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
     963             :       logical :: centin
     964             : 
     965             :    
     966             : 
     967             : 
     968           0 :       do irow=rbeg, rend
     969           0 :          aconvplane=convplanemap(irow)+1
     970           0 :          if(rflag(irow).eq.0) then 
     971           0 :             do ichan=1, nvischan
     972           0 :                achan=chanmap(ichan)+1
     973           0 :                aconvchan=convchanmap(ichan)+1
     974           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
     975           0 :      $              (weight(ichan,irow).ne.0.0)) then
     976           0 :                   if (onmosgrid(loc(1, ichan, irow), nx, ny, x0, y0, 
     977             :      $                 nxsub, nysub, support, msupportx, msupporty,
     978             :      $                 psupportx, psupporty, centin)) then
     979           0 :                      do ipol=1, nvispol
     980           0 :                         apol=polmap(ipol)+1
     981           0 :                         aconvpol=convpolmap(ipol)+1
     982             :                         if((flag(ipol,ichan,irow).ne.1).and.
     983           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
     984             : C     If we are making a PSF then we don't want to phase
     985             : C     rotate but we do want to reproject uvw
     986           0 :                            if(dopsf.eq.1) then
     987           0 :                               nvalue=cmplx(weight(ichan,irow))
     988             :                            else
     989             :                               nvalue=weight(ichan,irow)*
     990           0 :      $                  (values(ipol,ichan,irow)*phasor(ichan, irow))
     991             :                            end if
     992             :                           
     993             :                            
     994             : C     norm will be the value we would get for the peak
     995             : C     at the phase center. We will want to normalize 
     996             : C     the final image by this term.
     997           0 :                            norm=0.0
     998           0 :                            do iy=msupporty, psupporty
     999             :                                  iloc(2)=(sampling*iy)+
    1000           0 :      $                                off(2, ichan, irow)
    1001           0 :                                  yind=iloc(2)+(convsize)/2+1
    1002           0 :                                  do ix=msupportx, psupportx
    1003             :                                     iloc(1)=(sampling*ix)+
    1004           0 :      $                                   off(1, ichan, irow)
    1005           0 :                                     xind=iloc(1)+(convsize)/2+1
    1006             :                                     cwt=convfunc(xind, yind, 
    1007           0 :      $                                  aconvpol, aconvchan, aconvplane)
    1008             : C                          write(*,*) support, iloc 
    1009             :                                     grid(loc(1, ichan, irow)+ix,
    1010             :      $                           loc(2, ichan, irow)+iy,apol,achan)=
    1011             :      $                             grid(loc(1, ichan, irow)+ix,
    1012             :      $                           loc(2, ichan, irow)+iy,apol,achan)+
    1013           0 :      $                                   nvalue*cwt
    1014             :                                  end do
    1015             :                               end do
    1016           0 :                            if(centin) then
    1017             :                               sumwt(apol, achan)= sumwt(apol,achan)+
    1018           0 :      $                             weight(ichan,irow)
    1019             :                            end if 
    1020             :                         end if
    1021             :                      end do
    1022             :                   end if
    1023             :                end if
    1024             :             end do
    1025             :          end if
    1026             :       end do
    1027           0 :       return
    1028             :       end
    1029             : C
    1030             : 
    1031             : C   Same as sectgmosd2 except for varrying support across rows
    1032           0 :       subroutine sectgmosd3 (values, nvispol, nvischan,
    1033           0 :      $     dopsf, flag, rflag, weight, nrow, 
    1034           0 :      $     grid, nx, ny, npol, nchan, 
    1035           0 :      $     supports, convsize, sampling, convfunc, 
    1036           0 :      $     chanmap, polmap,
    1037           0 :      $     sumwt, convplanemap, 
    1038           0 :      $     convchanmap, convpolmap, 
    1039             :      $     nconvplane, nconvchan, nconvpol, x0, y0, nxsub, nysub, rbeg, 
    1040           0 :      $     rend, loc, off, phasor)
    1041             : 
    1042             :       implicit none
    1043             :       integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
    1044             :       complex, intent(in) :: values(nvispol, nvischan, nrow)
    1045             :       double complex, intent(inout) ::  grid(nx, ny, npol, nchan)
    1046             :       
    1047             :       integer, intent(in) :: x0, y0, nxsub, nysub
    1048             :       integer, intent(in)  :: loc(2, nvischan, nrow)
    1049             :       integer, intent(in) :: off(2, nvischan, nrow) 
    1050             :       complex, intent(in) :: phasor(nvischan, nrow)
    1051             :       integer, intent(in) :: flag(nvispol, nvischan, nrow)
    1052             :       integer, intent(in) ::  rflag(nrow)
    1053             :       real, intent(in) :: weight(nvischan, nrow)
    1054             :       double precision, intent(inout) ::  sumwt(npol, nchan)
    1055             :       integer, intent(in) ::  chanmap(nchan), polmap(npol)
    1056             :       integer,  intent(in) :: dopsf
    1057             : 
    1058             :       double complex :: nvalue
    1059             :       integer, intent(in) :: convsize, sampling
    1060             :       integer, intent(in) ::  nconvplane, nconvchan, nconvpol
    1061             :       integer, intent(in) ::  convplanemap(nrow)
    1062             :       integer, intent(in) ::  convchanmap(nvischan)
    1063             :       integer, intent(in) ::  convpolmap(nvispol)
    1064             :       complex, intent(in) :: convfunc(convsize, convsize, nconvpol, 
    1065             :      $     nconvchan,  nconvplane)
    1066             :       integer, intent(in) :: supports(nconvplane)
    1067             :       complex :: cwt
    1068           0 :       complex :: cfunc(convsize, convsize)
    1069             :       integer :: support
    1070             :       real :: norm
    1071             :       real ::  wt
    1072             : 
    1073             :       logical :: onmosgrid
    1074             : 
    1075             :       integer :: iloc(2)
    1076             :       integer :: iiloc(2)
    1077             :       integer, intent(in) ::  rbeg, rend
    1078             :       integer :: ix, iy, iz, ipol, ichan, xind, yind
    1079             :       integer :: apol, achan, aconvplane, irow
    1080             :       integer :: aconvpol, aconvchan, xind2, yind2
    1081             :       integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
    1082             :       logical :: centin
    1083             :       logical :: doconj
    1084             :    
    1085             : 
    1086             : 
    1087           0 :       do irow=rbeg, rend
    1088             : C     sign of convplanemap determines if to use conjg
    1089           0 :          aconvplane=abs(convplanemap(irow))+1
    1090           0 :          support=supports(aconvplane)
    1091             : C         write(*,*) 'support', support, 'acpl', aconvplane, convsize
    1092           0 :          doconj = (convplanemap(irow) < 0)
    1093           0 :          if(rflag(irow).eq.0) then 
    1094           0 :             do ichan=1, nvischan
    1095           0 :                achan=chanmap(ichan)+1
    1096           0 :                aconvchan=convchanmap(ichan)+1
    1097           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
    1098           0 :      $              (weight(ichan,irow).ne.0.0)) then
    1099           0 :                   if (onmosgrid(loc(1, ichan, irow), nx, ny, x0, y0, 
    1100             :      $                 nxsub, nysub, support, msupportx, msupporty,
    1101             :      $                 psupportx, psupporty, centin)) then
    1102           0 :                      do ipol=1, nvispol
    1103           0 :                         apol=polmap(ipol)+1
    1104           0 :                         aconvpol=convpolmap(ipol)+1
    1105             :                         if((flag(ipol,ichan,irow).ne.1).and.
    1106           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
    1107             : C     If we are making a PSF then we don't want to phase
    1108             : C     rotate but we do want to reproject uvw
    1109           0 :                            if(dopsf.eq.1) then
    1110           0 :                               nvalue=cmplx(weight(ichan,irow))
    1111             :                            else
    1112             :                               nvalue=weight(ichan,irow)*
    1113           0 :      $                  (values(ipol,ichan,irow)*phasor(ichan, irow))
    1114             :                            end if
    1115             :                           
    1116           0 :                  cfunc=convfunc(:,:, aconvpol, aconvchan, aconvplane)
    1117             : C     norm will be the value we would get for the peak
    1118             : C     at the phase center. We will want to normalize 
    1119             : C     the final image by this term.
    1120           0 :                            norm=0.0
    1121           0 :                            do iy=msupporty, psupporty
    1122             :                                  iloc(2)=(sampling*iy)+
    1123           0 :      $                                off(2, ichan, irow)
    1124           0 :                                  yind=iloc(2)+(convsize)/2+1
    1125           0 :                                  do ix=msupportx, psupportx
    1126             :                                     iloc(1)=(sampling*ix)+
    1127           0 :      $                                   off(1, ichan, irow)
    1128           0 :                                     xind=iloc(1)+(convsize)/2+1
    1129           0 :                                     cwt=cfunc(xind, yind)
    1130           0 :                                     if(doconj) cwt=conjg(cwt)
    1131             : C                          write(*,*) support, iloc
    1132             : C      write(*,*) loc(1, ichan, irow)+ix,loc(2, ichan, irow)+iy,xind,yind
    1133             :                                     grid(loc(1, ichan, irow)+ix,
    1134             :      $                           loc(2, ichan, irow)+iy,apol,achan)=
    1135             :      $                             grid(loc(1, ichan, irow)+ix,
    1136             :      $                           loc(2, ichan, irow)+iy,apol,achan)+
    1137           0 :      $                                   nvalue*cwt
    1138             :                                  end do
    1139             :                               end do
    1140           0 :                            if(centin) then
    1141             :                               sumwt(apol, achan)= sumwt(apol,achan)+
    1142           0 :      $                             weight(ichan,irow)
    1143             :                            endif
    1144             :                         end if
    1145             :                      end do
    1146             : C if onmos
    1147             :                   end if
    1148             :                end if
    1149             :             end do
    1150             :          end if
    1151             :       end do
    1152           0 :       return
    1153             :       end
    1154             : 
    1155             : 
    1156             :       
    1157           0 :       subroutine gmoss (uvw, dphase, values, nvispol, nvischan,
    1158           0 :      $     dopsf, flag, rflag, weight, nrow, rownum,
    1159           0 :      $     scale, offset, grid, nx, ny, npol, nchan, freq, c,
    1160           0 :      $     support, convsize, sampling, convfunc, 
    1161           0 :      $     chanmap, polmap,
    1162           0 :      $     sumwt, weightgrid, convweight, doweightgrid, convplanemap, 
    1163             :      $     nconvplane)
    1164             : 
    1165             :       implicit none
    1166             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow
    1167             :       complex values(nvispol, nvischan, nrow)
    1168             :       complex grid(nx, ny, npol, nchan)
    1169             :      
    1170             :       double precision uvw(3, nrow), freq(nvischan), c, scale(2),
    1171             :      $     offset(2)
    1172             :       double precision dphase(nrow), uvdist
    1173             :       double precision xlast, ylast
    1174             :       complex phasor
    1175             :       integer flag(nvispol, nvischan, nrow)
    1176             :       integer rflag(nrow)
    1177             :       real weight(nvischan, nrow), phase
    1178             :       double precision sumwt(npol, nchan)
    1179             :       integer rownum
    1180             :       integer support
    1181             :       integer chanmap(nchan), polmap(npol)
    1182             :       integer dopsf
    1183             :       complex weightgrid(nx, ny, npol, nchan)
    1184             :       integer doweightgrid
    1185             : 
    1186             :       complex nvalue
    1187             :       complex nweight
    1188             :       integer convsize, sampling
    1189             :       integer nconvplane
    1190             :       integer convplanemap(nrow)
    1191             :       complex convfunc(convsize, convsize, nconvplane), cwt, crot
    1192             :       complex convweight(convsize, convsize, nconvplane)
    1193             :       
    1194             : 
    1195             :       complex sconv(-(support+1)*sampling:(support+1)*sampling, 
    1196           0 :      $     -(support+1)*sampling:(support+1)*sampling, nconvplane)
    1197             :       complex sconv2(-(support+1)*sampling:(support+1)*sampling, 
    1198           0 :      $     -(support+1)*sampling:(support+1)*sampling, nconvplane)
    1199             :       real sumsconv
    1200             :       real sumsconv2
    1201             :       real ratioofbeam
    1202             : 
    1203             :       real norm
    1204             :       real wt
    1205             : 
    1206             :       logical omos, doshift
    1207             : 
    1208             :       real pos(3)
    1209             :       integer loc(2), off(2), iloc(2)
    1210             :       integer iiloc(2)
    1211             :       integer rbeg, rend
    1212             :       integer ix, iy, iz, ipol, ichan
    1213             :       integer apol, achan, aconvplane, irow
    1214             :       double precision pi
    1215             :       data pi/3.14159265358979323846/
    1216             :       integer sampsupp
    1217           0 :       sampsupp=(support+1)*sampling
    1218           0 :       irow=rownum
    1219             : 
    1220           0 :       sumsconv=0
    1221           0 :       sumsconv2=0
    1222           0 :       ratioofbeam=1.0
    1223           0 :       do iz=1, nconvplane
    1224           0 :          do iy=-sampsupp,sampsupp
    1225           0 :             iloc(2)=iy+convsize/2+1
    1226           0 :             do ix=-sampsupp,sampsupp
    1227           0 :                iloc(1)=ix+convsize/2+1
    1228           0 :                sconv(ix,iy,iz)=(convfunc(iloc(1), iloc(2),iz))
    1229           0 :                sconv2(ix,iy,iz)=convweight(iloc(1), iloc(2),iz)
    1230             :             end do
    1231             :          end do
    1232             :       end do
    1233           0 :       doshift=.FALSE.
    1234             : 
    1235           0 :       if(irow.ge.0) then
    1236           0 :          rbeg=irow+1
    1237           0 :          rend=irow+1
    1238             :       else 
    1239           0 :          rbeg=1
    1240           0 :          rend=nrow
    1241             :       end if
    1242             : 
    1243           0 :       xlast=0.0
    1244           0 :       ylast=0.0
    1245           0 :       do irow=rbeg, rend
    1246           0 :          aconvplane=convplanemap(irow)+1
    1247           0 :          if(rflag(irow).eq.0) then 
    1248           0 :             do ichan=1, nvischan
    1249           0 :                achan=chanmap(ichan)+1
    1250           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
    1251           0 :      $              (weight(ichan,irow).ne.0.0)) then
    1252             :                   call smos(uvw(1,irow), dphase(irow), freq(ichan), c, 
    1253           0 :      $                 scale, offset, sampling, pos, loc, off, phasor)
    1254           0 :                   if (omos(nx, ny, loc, support)) then
    1255           0 :                      do ipol=1, nvispol
    1256           0 :                         apol=polmap(ipol)+1
    1257             :                         if((flag(ipol,ichan,irow).ne.1).and.
    1258           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
    1259             : C     If we are making a PSF then we don't want to phase
    1260             : C     rotate but we do want to reproject uvw
    1261           0 :                            if(dopsf.eq.1) then
    1262           0 :                               nvalue=cmplx(weight(ichan,irow))
    1263             :                            else
    1264             :                               nvalue=weight(ichan,irow)*
    1265           0 :      $                             (values(ipol,ichan,irow)*phasor)
    1266             :                            end if
    1267           0 :                            if(doweightgrid .gt. 0) then
    1268           0 :                               nweight=cmplx(weight(ichan,irow))
    1269             :                            end if
    1270             :                            
    1271             : C     norm will be the value we would get for the peak
    1272             : C     at the phase center. We will want to normalize 
    1273             : C     the final image by this term.
    1274           0 :                            norm=0.0
    1275           0 :                            if(sampling.eq.1) then
    1276           0 :                               do iy=-support,support
    1277           0 :                                  do ix=-support,support
    1278             :                                     grid(loc(1)+ix,
    1279             :      $                                   loc(2)+iy,apol,achan)=
    1280             :      $                                   grid(loc(1)+ix,
    1281             :      $                                   loc(2)+iy,apol,achan)+
    1282           0 :      $                                   nvalue*sconv(ix,iy, aconvplane)
    1283             : 
    1284           0 :                                     if(doweightgrid .gt. 0) then
    1285           0 :                                        iloc(1)=nx/2+1+ix
    1286           0 :                                        iloc(2)=ny/2+1+iy
    1287             :                                        weightgrid(iloc(1),iloc(2),
    1288             :      $                                  apol,achan)= weightgrid(
    1289             :      $                                  iloc(1),iloc(2),apol,achan)
    1290           0 :      $                               + nweight*sconv2(ix,iy,aconvplane)
    1291             : 
    1292             :                                     end if
    1293             :                                  end do
    1294             :                               end do
    1295             :                            else 
    1296           0 :                               do iy=-support,support
    1297           0 :                                  iloc(2)=(sampling*iy+off(2))+1
    1298           0 :                                  do ix=-support, support
    1299           0 :                                     iloc(1)=(sampling*ix+off(1))+1
    1300             :                                     cwt=sconv(iloc(1),
    1301           0 :      $                                   iloc(2),aconvplane)
    1302             :                                     grid(loc(1)+ix,
    1303             :      $                                   loc(2)+iy,apol,achan)=
    1304             :      $                                   grid(loc(1)+ix,
    1305             :      $                                   loc(2)+iy,apol,achan)+
    1306           0 :      $                                   nvalue*cwt
    1307           0 :                                     if(doweightgrid .gt. 0) then
    1308             :                                        cwt=sconv2(iloc(1), iloc(2), 
    1309           0 :      $                                      aconvplane)
    1310           0 :                                        iiloc(1)=nx/2+1+ix
    1311           0 :                                        iiloc(2)=ny/2+1+iy
    1312             :                                        weightgrid(iiloc(1),iiloc(2),
    1313             :      $                                      apol,achan)= weightgrid(
    1314             :      $                                   iiloc(1),iiloc(2),apol,achan)
    1315           0 :      $                                + nweight*cwt
    1316             : 
    1317             :                                     end if
    1318             :                                  end do
    1319             :                               end do
    1320             :                            end if  
    1321             :                            sumwt(apol, achan)= sumwt(apol,achan)+
    1322           0 :      $                             weight(ichan,irow)
    1323             :                         end if
    1324             :                      end do
    1325             :                   end if
    1326             :                end if
    1327             :             end do
    1328             :          end if
    1329             :       end do
    1330           0 :       return
    1331             :       end
    1332             : C
    1333           0 :            subroutine gmoss2 (uvw, dphase, values, nvispol, nvischan,
    1334           0 :      $     dopsf, flag, rflag, weight, nrow, rownum,
    1335           0 :      $     scale, offset, grid, nx, ny, npol, nchan, freq, c,
    1336           0 :      $     support, convsize, sampling, convfunc, 
    1337           0 :      $     chanmap, polmap,
    1338           0 :      $     sumwt, weightgrid, convweight, doweightgrid, convplanemap, 
    1339           0 :      $     convchanmap, convpolmap, 
    1340             :      $     nconvplane, nconvchan, nconvpol)
    1341             : 
    1342             :       implicit none
    1343             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow
    1344             :       complex values(nvispol, nvischan, nrow)
    1345             :       complex grid(nx, ny, npol, nchan)
    1346             :      
    1347             :       double precision uvw(3, nrow), freq(nvischan), c, scale(2),
    1348             :      $     offset(2)
    1349             :       double precision dphase(nrow), uvdist
    1350             :       double precision xlast, ylast
    1351             :       complex phasor
    1352             :       integer flag(nvispol, nvischan, nrow)
    1353             :       integer rflag(nrow)
    1354             :       real weight(nvischan, nrow), phase
    1355             :       double precision sumwt(npol, nchan)
    1356             :       integer rownum
    1357             :       integer support
    1358             :       integer chanmap(nchan), polmap(npol)
    1359             :       integer dopsf
    1360             :       complex weightgrid(nx, ny, npol, nchan)
    1361             :       integer doweightgrid
    1362             : 
    1363             :       double complex nvalue
    1364             :       double complex nweight
    1365             :       integer convsize, sampling
    1366             :       integer nconvplane, nconvchan, nconvpol
    1367             :       integer convplanemap(nrow)
    1368             :       integer convchanmap(nvischan)
    1369             :       integer convpolmap(nvispol)
    1370             :       complex convfunc(convsize, convsize, nconvpol, nconvchan, 
    1371             :      $ nconvplane), cwt, crot
    1372             :       complex convweight(convsize, convsize, nconvpol, nconvchan, 
    1373             :      $ nconvplane)
    1374             :       real sumsconv
    1375             :       real sumsconv2
    1376             :       real ratioofbeam
    1377             : 
    1378             :       real norm
    1379             :       real wt
    1380             : 
    1381             :       logical omos, doshift
    1382             : 
    1383             :       real pos(3)
    1384             :       integer loc(2), off(2), iloc(2)
    1385             :       integer iiloc(2)
    1386             :       integer rbeg, rend
    1387             :       integer ix, iy, iz, ipol, ichan, xind, yind
    1388             :       integer apol, achan, aconvplane, irow
    1389             :       integer aconvpol, aconvchan, xind2, yind2
    1390             :       double precision pi
    1391             :       data pi/3.14159265358979323846/
    1392             :       real maxsconv2, minsconv2
    1393           0 :       irow=rownum
    1394             : 
    1395           0 :       sumsconv=0
    1396           0 :       sumsconv2=0
    1397           0 :       ratioofbeam=1.0
    1398             : 
    1399           0 :       doshift=.FALSE.
    1400             : 
    1401           0 :       if(irow.ge.0) then
    1402           0 :          rbeg=irow+1
    1403           0 :          rend=irow+1
    1404             :       else 
    1405           0 :          rbeg=1
    1406           0 :          rend=nrow
    1407             :       end if
    1408             : 
    1409             : C      write(*,*) 'max of sconvs ', maxsconv2, minsconv2, sampsupp, 
    1410             : C     $     convsize 
    1411             : 
    1412             : 
    1413             : 
    1414           0 :       xlast=0.0
    1415           0 :       ylast=0.0
    1416           0 :       do irow=rbeg, rend
    1417           0 :          aconvplane=convplanemap(irow)+1
    1418           0 :          if(rflag(irow).eq.0) then 
    1419           0 :             do ichan=1, nvischan
    1420           0 :                achan=chanmap(ichan)+1
    1421           0 :                aconvchan=convchanmap(ichan)+1
    1422           0 :                if((achan.ge.1).and.(achan.le.nchan).and.
    1423           0 :      $              (weight(ichan,irow).ne.0.0)) then
    1424             :                   call smos(uvw(1,irow), dphase(irow), freq(ichan), c, 
    1425           0 :      $                 scale, offset, sampling, pos, loc, off, phasor)
    1426           0 :                   if (omos(nx, ny, loc, support)) then
    1427           0 :                      do ipol=1, nvispol
    1428           0 :                         apol=polmap(ipol)+1
    1429           0 :                         aconvpol=convpolmap(ipol)+1
    1430             :                         if((flag(ipol,ichan,irow).ne.1).and.
    1431           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
    1432             : C     If we are making a PSF then we don't want to phase
    1433             : C     rotate but we do want to reproject uvw
    1434           0 :                            if(dopsf.eq.1) then
    1435           0 :                               nvalue=cmplx(weight(ichan,irow))
    1436             :                            else
    1437             :                               nvalue=weight(ichan,irow)*
    1438           0 :      $                             (values(ipol,ichan,irow)*phasor)
    1439             :                            end if
    1440           0 :                            if(doweightgrid .gt. 0) then
    1441           0 :                               nweight=cmplx(weight(ichan,irow))
    1442             :                            end if
    1443             :                            
    1444             : C     norm will be the value we would get for the peak
    1445             : C     at the phase center. We will want to normalize 
    1446             : C     the final image by this term.
    1447           0 :                            norm=0.0
    1448           0 :                            if(sampling.eq.1) then
    1449           0 :                               do iy=-support,support
    1450           0 :                                  yind=iy+(convsize)/2+1
    1451           0 :                                  do ix=-support,support
    1452           0 :                                     xind=ix+(convsize)/2+1
    1453             :                                     grid(loc(1)+ix,
    1454             :      $                                   loc(2)+iy,apol,achan)=
    1455             :      $                                   grid(loc(1)+ix,
    1456             :      $                                   loc(2)+iy,apol,achan)+
    1457             :      $                                   nvalue*convfunc(xind, yind, 
    1458           0 :      $                                  aconvpol, aconvchan, aconvplane)
    1459             : 
    1460           0 :                                     if(doweightgrid .gt. 0) then
    1461           0 :                                        iloc(1)=nx/2+1+ix
    1462           0 :                                        iloc(2)=ny/2+1+iy
    1463             :                                        weightgrid(iloc(1),iloc(2),
    1464             :      $                                  apol,achan)= weightgrid(
    1465             :      $                                  iloc(1),iloc(2),apol,achan)
    1466             :      $                               + nweight*convweight(xind, yind, 
    1467           0 :      $                                  aconvpol, aconvchan, aconvplane)
    1468             : 
    1469             :                                     end if
    1470             :                                  end do
    1471             :                               end do
    1472             :                            else 
    1473             : C                              write(*,*)off
    1474           0 :                               do iy=-support, support
    1475           0 :                                  iloc(2)=(sampling*iy)+off(2)
    1476           0 :                                  yind=iloc(2)+(convsize)/2+1
    1477           0 :                                  do ix=-support, support
    1478           0 :                                     iloc(1)=(sampling*ix)+off(1)
    1479           0 :                                     xind=iloc(1)+(convsize)/2+1
    1480             :                                     cwt=convfunc(xind, yind, 
    1481           0 :      $                                  aconvpol, aconvchan, aconvplane)
    1482             : C         write(*,*) yind, xind, loc(1)+ix, loc(2)+iy, apol, achan, 
    1483             : C     $ aconvpol, aconvchan, aconvplane 
    1484             :                                     grid(loc(1)+ix,
    1485             :      $                                   loc(2)+iy,apol,achan)=
    1486             :      $                                   grid(loc(1)+ix,
    1487             :      $                                   loc(2)+iy,apol,achan)+
    1488           0 :      $                                   nvalue*cwt
    1489           0 :                                     if(doweightgrid .gt. 0) then
    1490           0 :                                        xind2=sampling*ix+(convsize)/2+1
    1491           0 :                                        yind2=sampling*iy+(convsize)/2+1
    1492             :                                        cwt=convweight(xind2, 
    1493             :      $                                      yind2, aconvpol, aconvchan, 
    1494           0 :      $                                      aconvplane)
    1495           0 :                                        iiloc(1)=nx/2+1+ix
    1496           0 :                                        iiloc(2)=ny/2+1+iy
    1497             :                                        weightgrid(iiloc(1),iiloc(2),
    1498             :      $                                      apol,achan)= weightgrid(
    1499             :      $                                   iiloc(1),iiloc(2),apol,achan)
    1500           0 :      $                                + nweight*cwt
    1501             : 
    1502             :                                     end if
    1503             :                                  end do
    1504             :                               end do
    1505             :                            end if  
    1506             :                            sumwt(apol, achan)= sumwt(apol,achan)+
    1507           0 :      $                             weight(ichan,irow)
    1508             :                         end if
    1509             :                      end do
    1510             :                   end if
    1511             :                end if
    1512             :             end do
    1513             :          end if
    1514             :       end do
    1515           0 :       return
    1516             :       end
    1517             : C
    1518             : 
    1519             : 
    1520             : 
    1521             : C Degrid a number of visibility records
    1522             : C
    1523           0 :       subroutine dmos (uvw, dphase, values, nvispol, nvischan,
    1524           0 :      $     flag, rflag,
    1525           0 :      $     nrow, rownum, scale, offset, grid, nx, ny, npol, nchan, freq,
    1526           0 :      $     c, support, convsize, sampling, convfunc,
    1527           0 :      $     chanmap, polmap, convplanemap, nconvplane)
    1528             : 
    1529             :       implicit none
    1530             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow
    1531             :       integer nconvplane
    1532             :       complex values(nvispol, nvischan, nrow)
    1533             :       complex grid(nx, ny, npol, nchan)
    1534             :       double precision uvw(3, nrow), freq(nvischan), c, scale(2),
    1535             :      $     offset(2)
    1536             :       double precision dphase(nrow), uvdist
    1537             :       double precision xlast, ylast
    1538             :       complex phasor
    1539             :       integer flag(nvispol, nvischan, nrow)
    1540             :       integer rflag(nrow)
    1541             :       integer rownum
    1542             :       integer support
    1543             :       integer chanmap(nchan), polmap(npol)
    1544             :       integer convplanemap(nrow)
    1545             :       complex nvalue
    1546             : 
    1547             :       integer convsize, sampling
    1548             :       complex convfunc(convsize, convsize, nconvplane), cwt, crot
    1549             : 
    1550             :       integer sampsupp
    1551             :       
    1552             :       complex sconv(-(support+1)*sampling:(support+1)*sampling, 
    1553           0 :      $     -(support+1)*sampling:(support+1)*sampling, nconvplane)
    1554             : 
    1555             :       real norm, phase
    1556             : 
    1557             :       logical omos, doshift
    1558             : 
    1559             :       real pos(2)
    1560             :       integer loc(2), off(2), iloc(2)
    1561             :       integer rbeg, rend
    1562             :       integer ix, iy, iz, ipol, ichan
    1563             :       integer apol, achan, aconvplane, irow
    1564             :       real wt, wtx, wty
    1565             :       double precision pi
    1566             :       data pi/3.14159265358979323846/
    1567             :       
    1568           0 :       sampsupp=(support+1)*sampling
    1569           0 :       irow=rownum
    1570             : 
    1571           0 :       do iz=1, nconvplane
    1572           0 :          do iy=-sampsupp,sampsupp
    1573           0 :             iloc(2)=iy+convsize/2+1
    1574           0 :             do ix=-sampsupp,sampsupp
    1575           0 :                iloc(1)=ix+convsize/2+1
    1576           0 :                sconv(ix,iy,iz)=conjg(convfunc(iloc(1), iloc(2),iz))
    1577             :             end do
    1578             :          end do
    1579             :       end do
    1580           0 :       doshift=.FALSE.
    1581             : 
    1582           0 :       if(irow.ge.0) then
    1583           0 :          rbeg=irow+1
    1584           0 :          rend=irow+1
    1585             :       else 
    1586           0 :          rbeg=1
    1587           0 :          rend=nrow
    1588             :       end if
    1589             : C
    1590           0 :       xlast=0.0
    1591           0 :       ylast=0.0
    1592           0 :       do irow=rbeg, rend
    1593           0 :          aconvplane=convplanemap(irow)+1
    1594           0 :          if(rflag(irow).eq.0) then
    1595           0 :             do ichan=1, nvischan
    1596           0 :                achan=chanmap(ichan)+1
    1597           0 :                if((achan.ge.1).and.(achan.le.nchan)) then
    1598             :                   call smos(uvw(1,irow), dphase(irow), freq(ichan), c,
    1599           0 :      $                 scale, offset, sampling, pos, loc, off, phasor)
    1600           0 :                   if (omos(nx, ny, loc, support)) then
    1601           0 :                      do ipol=1, nvispol
    1602           0 :                         apol=polmap(ipol)+1
    1603             :                         if((flag(ipol,ichan,irow).ne.1).and.
    1604           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
    1605           0 :                            nvalue=0.0
    1606           0 :                            norm=0.0
    1607           0 :                            if(sampling.eq.1) then
    1608           0 :                              do iy=-support,support
    1609           0 :                                  do ix=-support,support
    1610             :                                     nvalue=nvalue+(sconv(ix,iy,
    1611             :      $                               aconvplane))*
    1612             :      $                                   grid(loc(1)+ix,loc(2)+iy,
    1613           0 :      $                                   apol,achan)
    1614             :                                  end do
    1615             :                               end do
    1616             :                            else
    1617           0 :                               do iy=-support,support
    1618           0 :                                  iloc(2)=sampling*iy+off(2)
    1619           0 :                                  do ix=-support,support
    1620             :                                     iloc(1)=ix*sampling
    1621           0 :      $                                   +off(1)
    1622             :                                     cwt=sconv(iloc(1),
    1623           0 :      $                                   iloc(2),aconvplane)
    1624             :                                     nvalue=nvalue+cwt*
    1625             :      $                                   grid(loc(1)+ix,loc(2)+iy,
    1626           0 :      $                                   apol,achan)
    1627             :                                  end do
    1628             :                               end do
    1629             :                            end if 
    1630             :                            values(ipol,ichan,irow)=nvalue*conjg(
    1631           0 :      $                         phasor)
    1632             :                        end if
    1633             :                      end do
    1634             :                   end if
    1635             :                end if
    1636             :             end do
    1637             :          end if
    1638             :       end do
    1639           0 :       return
    1640             :       end
    1641             : C
    1642             : 
    1643             : C Degrid a number of visibility records
    1644             : C
    1645           0 :       subroutine dmos2 (uvw, dphase, values, nvispol, nvischan,
    1646           0 :      $     flag, rflag,
    1647           0 :      $     nrow, rownum, scale, offset, grid, nx, ny, npol, nchan, freq,
    1648           0 :      $     c, support, convsize, sampling, convfunc,
    1649           0 :      $     chanmap, polmap, convplanemap, convchanmap, convpolmap, 
    1650             :      $     nconvplane, nconvchan, nconvpol)
    1651             : 
    1652             :       implicit none
    1653             :       integer nx, ny, npol, nchan, nvispol, nvischan, nrow
    1654             :       integer nconvplane, nconvchan, nconvpol
    1655             :       complex values(nvispol, nvischan, nrow)
    1656             :       complex grid(nx, ny, npol, nchan)
    1657             :       double precision uvw(3, nrow), freq(nvischan), c, scale(2),
    1658             :      $     offset(2)
    1659             :       double precision dphase(nrow), uvdist
    1660             :       double precision xlast, ylast
    1661             :       complex phasor
    1662             :       integer flag(nvispol, nvischan, nrow)
    1663             :       integer rflag(nrow)
    1664             :       integer rownum
    1665             :       integer support
    1666             :       integer chanmap(nchan), polmap(npol)
    1667             :       integer convplanemap(nrow), convchanmap(nvischan)
    1668             :       integer convpolmap(nvispol)
    1669             :       complex nvalue
    1670             : 
    1671             :       integer convsize, sampling
    1672             :       complex convfunc(convsize, convsize, nconvpol, nconvchan, 
    1673             :      $ nconvplane), cwt, crot
    1674             : 
    1675             :       integer sampsupp
    1676             :       
    1677             : C      complex sconv(-(support+1)*sampling:(support+1)*sampling, 
    1678             : C     $     -(support+1)*sampling:(support+1)*sampling, nconvplane)
    1679             : 
    1680             :       real norm, phase
    1681             : 
    1682             :       logical omos, doshift
    1683             : 
    1684             :       real pos(2)
    1685             :       integer loc(2), off(2), iloc(2)
    1686             :       integer rbeg, rend
    1687             :       integer ix, iy, iz, ipol, ichan, xind, yind
    1688             :       integer apol, achan, aconvplane, irow
    1689             :       integer aconvchan, aconvpol
    1690             :       real wt, wtx, wty
    1691             :       double precision pi
    1692             :       data pi/3.14159265358979323846/
    1693             :       
    1694           0 :       sampsupp=(support+1)*sampling
    1695           0 :       irow=rownum
    1696             : 
    1697             : C      do iz=1, nconvplane
    1698             : C         do iy=-sampsupp,sampsupp
    1699             : C            iloc(2)=iy+convsize/2+1
    1700             : c            do ix=-sampsupp,sampsupp
    1701             : C               iloc(1)=ix+convsize/2+1
    1702             : C               sconv(ix,iy,iz)=conjg(convfunc(iloc(1), iloc(2),iz))
    1703             : C            end do
    1704             : C         end do
    1705             : C      end do
    1706           0 :       doshift=.FALSE.
    1707             : 
    1708           0 :       if(irow.ge.0) then
    1709           0 :          rbeg=irow+1
    1710           0 :          rend=irow+1
    1711             :       else 
    1712           0 :          rbeg=1
    1713           0 :          rend=nrow
    1714             :       end if
    1715             : C
    1716           0 :       xlast=0.0
    1717           0 :       ylast=0.0
    1718           0 :       do irow=rbeg, rend
    1719           0 :          aconvplane=convplanemap(irow)+1
    1720           0 :          if(rflag(irow).eq.0) then
    1721           0 :             do ichan=1, nvischan
    1722           0 :                achan=chanmap(ichan)+1
    1723           0 :                aconvchan=convchanmap(ichan)+1
    1724           0 :                if((achan.ge.1).and.(achan.le.nchan)) then
    1725             :                   call smos(uvw(1,irow), dphase(irow), freq(ichan), c,
    1726           0 :      $                 scale, offset, sampling, pos, loc, off, phasor)
    1727           0 :                   if (omos(nx, ny, loc, support)) then
    1728           0 :                      do ipol=1, nvispol
    1729           0 :                         apol=polmap(ipol)+1
    1730           0 :                         aconvpol=convpolmap(ipol)+1
    1731             :                         if((flag(ipol,ichan,irow).ne.1).and.
    1732           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
    1733             : C          write(*,*) 'aindices', aconvplane, aconvchan, aconvpol
    1734           0 :                            nvalue=0.0
    1735           0 :                            norm=0.0
    1736           0 :                            if(sampling.eq.1) then
    1737           0 :                              do iy=-support,support
    1738           0 :                                 yind=iy+(convsize)/2+1
    1739           0 :                                  do ix=-support,support
    1740           0 :                                     xind=ix+(convsize)/2+1
    1741             :                                     nvalue=nvalue+(convfunc(xind,yind,
    1742             :      $                                aconvpol, aconvchan,
    1743             :      $                               aconvplane))*
    1744             :      $                                   grid(loc(1)+ix,loc(2)+iy,
    1745           0 :      $                                   apol,achan)
    1746             :                                  end do
    1747             :                               end do
    1748             :                            else
    1749           0 :                               do iy=-support,support
    1750           0 :                                  iloc(2)=sampling*iy+off(2)
    1751           0 :                                  yind=iloc(2)+(convsize)/2+1
    1752             : C        write(*,*) 'iloc(2)', iloc(2), off(2), yind
    1753           0 :                                  do ix=-support,support
    1754             :                                     iloc(1)=ix*sampling
    1755           0 :      $                                   +off(1)
    1756           0 :                                     xind=iloc(1)+(convsize)/2+1
    1757             : C        write(*,*) 'iloc(1)', iloc(1), off(1), xind
    1758             :                                     cwt=convfunc(xind, yind, aconvpol,
    1759           0 :      $                                   aconvchan,aconvplane)
    1760             :                                     nvalue=nvalue+cwt*
    1761             :      $                                   grid(loc(1)+ix,loc(2)+iy,
    1762           0 :      $                                   apol,achan)
    1763             :                                  end do
    1764             :                               end do
    1765             :                            end if 
    1766             :                            values(ipol,ichan,irow)=nvalue*conjg(
    1767           0 :      $                         phasor)
    1768             :                        end if
    1769             :                      end do
    1770             :                   end if
    1771             :                end if
    1772             :             end do
    1773             :          end if
    1774             :       end do
    1775           0 :       return
    1776             :       end
    1777             : C
    1778             : 
    1779             : C
    1780           0 :       subroutine sectdmos2 (values, nvispol, nvischan,
    1781           0 :      $     flag, rflag,
    1782           0 :      $     nrow, grid, nx, ny, npol, nchan, 
    1783           0 :      $     support, convsize, sampling, convfunc,
    1784           0 :      $    chanmap, polmap, convplanemap, convchanmap, convpolmap, 
    1785           0 :      $    nconvplane, nconvchan, nconvpol, rbeg,rend,loc,off,phasor)
    1786             : 
    1787             :       implicit none
    1788             :       integer, intent(in) ::  nx, ny,npol,nchan,nvispol, nvischan, nrow
    1789             :       integer, intent(in) ::  nconvplane, nconvchan, nconvpol
    1790             :       complex, intent(inout) :: values(nvispol, nvischan, nrow)
    1791             :       complex, intent(in) :: grid(nx, ny, npol, nchan)
    1792             :       complex, intent(in) :: phasor(nvischan, nrow)
    1793             :       integer, intent(in) ::  flag(nvispol, nvischan, nrow)
    1794             :       integer, intent(in) ::  rflag(nrow)
    1795             :       integer, intent(in) ::  support
    1796             :       integer, intent(in) :: chanmap(*), polmap(*)
    1797             :       integer, intent(in) :: convplanemap(nrow), convchanmap(nvischan)
    1798             :       integer, intent(in) ::  convpolmap(nvispol)
    1799             :       complex :: nvalue
    1800             : 
    1801             :       integer, intent(in) :: convsize, sampling
    1802             :       complex, intent(in) ::  convfunc(convsize, convsize, nconvpol, 
    1803             :      $     nconvchan, nconvplane)
    1804             :       complex :: cwt, crot
    1805             :       
    1806             : C      complex sconv(-(support+1)*sampling:(support+1)*sampling, 
    1807             : C     $     -(support+1)*sampling:(support+1)*sampling, nconvplane)
    1808             : 
    1809             :       real :: norm, phase
    1810             : 
    1811             :       logical :: omos
    1812             :       logical :: doconj
    1813             :     
    1814             :       integer, intent(in) :: loc(2, nvischan, nrow), 
    1815             :      $     off(2,nvischan,nrow)
    1816             :       integer :: iloc(2)
    1817             :       integer, intent(in) ::  rbeg, rend
    1818             :       integer :: ix, iy, iz, ipol, ichan, xind, yind
    1819             :       integer :: apol, achan, aconvplane, irow
    1820             :       integer :: aconvchan, aconvpol
    1821             :       real :: wt, wtx, wty
    1822             : 
    1823             :       
    1824             : C      write(*,*) 'polmap, ', polmap
    1825             : C      write(*,*) 'convpm,', convpolmap
    1826             : C      write(*,*) 'chanmp,', chanmap
    1827             : C      write(*,*) 'convcm,', convchanmap
    1828             : 
    1829           0 :       do irow=rbeg, rend
    1830           0 :          aconvplane=abs(convplanemap(irow))+1
    1831           0 :          doconj=(convplanemap(irow) < 0)
    1832           0 :          if(rflag(irow).eq.0) then
    1833           0 :             do ichan=1, nvischan
    1834           0 :                achan=chanmap(ichan)+1
    1835           0 :                aconvchan=convchanmap(ichan)+1
    1836           0 :                if((achan.ge.1).and.(achan.le.nchan)) then
    1837           0 :                   if (omos(nx, ny, loc(1, ichan,irow),support)) then
    1838           0 :                      do ipol=1, nvispol
    1839           0 :                         apol=polmap(ipol)+1
    1840           0 :                         aconvpol=convpolmap(ipol)+1
    1841             :                         if((flag(ipol,ichan,irow).ne.1).and.
    1842           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
    1843             : C          write(*,*) 'aindices', aconvplane, aconvchan, aconvpol
    1844           0 :                            nvalue=0.0
    1845           0 :                            norm=0.0
    1846             :                           
    1847           0 :                               do iy=-support,support
    1848           0 :                                  iloc(2)=sampling*iy+off(2, ichan, irow)
    1849           0 :                                  yind=iloc(2)+(convsize)/2+1
    1850             : C        write(*,*) 'iloc(2)', iloc(2), off(2), yind
    1851           0 :                                  do ix=-support,support
    1852             :                                     iloc(1)=ix*sampling
    1853           0 :      $                                   +off(1, ichan, irow)
    1854           0 :                                     xind=iloc(1)+(convsize)/2+1
    1855             : C        write(*,*) 'iloc(1)', iloc(1), off(1), xind
    1856             :                                     cwt=convfunc(xind, yind, aconvpol,
    1857           0 :      $                                   aconvchan,aconvplane)
    1858           0 :                                     if(doconj) cwt=conjg(cwt)
    1859             :                                     nvalue=nvalue+cwt*
    1860             :      $                                   grid(loc(1, ichan, irow)+ix,
    1861             :      $                                   loc(2, ichan, irow)+iy,
    1862           0 :      $                                   apol,achan)
    1863             :                                  end do
    1864             :                               end do
    1865             :                           
    1866             :                            values(ipol,ichan,irow)=nvalue*conjg(
    1867           0 :      $                         phasor(ichan, irow))
    1868             :                        end if
    1869             :                      end do
    1870             :                   end if
    1871             :                end if
    1872             :             end do
    1873             :          end if
    1874             :       end do
    1875           0 :       return
    1876             :       end
    1877             : C
    1878             : C same as sectdmos2 except with varying support
    1879           0 :       subroutine sectdmos3 (values, nvispol, nvischan,
    1880           0 :      $     flag, rflag,
    1881           0 :      $     nrow, grid, nx, ny, npol, nchan, 
    1882           0 :      $     supports, convsize, sampling, convfunc,
    1883           0 :      $    chanmap, polmap, convplanemap, convchanmap, convpolmap, 
    1884           0 :      $    nconvplane, nconvchan, nconvpol, rbeg,rend,loc,off,phasor)
    1885             : 
    1886             :       implicit none
    1887             :       integer, intent(in) ::  nx, ny,npol,nchan,nvispol, nvischan, nrow
    1888             :       integer, intent(in) ::  nconvplane, nconvchan, nconvpol
    1889             :       complex, intent(inout) :: values(nvispol, nvischan, nrow)
    1890             :       complex, intent(in) :: grid(nx, ny, npol, nchan)
    1891             :       complex, intent(in) :: phasor(nvischan, nrow)
    1892             :       integer, intent(in) ::  flag(nvispol, nvischan, nrow)
    1893             :       integer, intent(in) ::  rflag(nrow)
    1894             :       integer, intent(in) :: chanmap(*), polmap(*)
    1895             :       integer, intent(in) :: convplanemap(nrow), convchanmap(nvischan)
    1896             :       integer, intent(in) ::  convpolmap(nvispol)
    1897             :       complex :: nvalue
    1898             : 
    1899             :       integer, intent(in) :: convsize, sampling
    1900             :       complex, intent(in) ::  convfunc(convsize, convsize, nconvpol, 
    1901             :      $     nconvchan, nconvplane)
    1902             :       integer, intent(in) ::  supports(nconvplane)
    1903             :       complex :: cwt, crot
    1904             :       
    1905             : C      complex sconv(-(support+1)*sampling:(support+1)*sampling, 
    1906             : C     $     -(support+1)*sampling:(support+1)*sampling, nconvplane)
    1907           0 :       complex cfunc(convsize, convsize)
    1908             :       real :: norm, phase
    1909             :       integer :: support
    1910             :       logical :: omos
    1911             :       logical :: doconj
    1912             :     
    1913             :       integer, intent(in) :: loc(2, nvischan, nrow), 
    1914             :      $     off(2,nvischan,nrow)
    1915             :       integer :: iloc(2)
    1916             :       integer, intent(in) ::  rbeg, rend
    1917             :       integer :: ix, iy, iz, ipol, ichan, xind, yind
    1918             :       integer :: apol, achan, aconvplane, irow
    1919             :       integer :: aconvchan, aconvpol
    1920             :       real :: wt, wtx, wty
    1921             : 
    1922             :       
    1923             : C      write(*,*) 'polmap, ', polmap
    1924             : C      write(*,*) 'convpm,', convpolmap
    1925             : C      write(*,*) 'chanmp,', chanmap
    1926             : C      write(*,*) 'convcm,', convchanmap
    1927             : 
    1928           0 :       do irow=rbeg, rend
    1929           0 :          aconvplane=abs(convplanemap(irow))+1
    1930           0 :          support=supports(aconvplane)
    1931           0 :          doconj=(convplanemap(irow) < 0)
    1932           0 :          if(rflag(irow).eq.0) then
    1933           0 :             do ichan=1, nvischan
    1934           0 :                achan=chanmap(ichan)+1
    1935           0 :                aconvchan=convchanmap(ichan)+1
    1936           0 :                if((achan.ge.1).and.(achan.le.nchan)) then
    1937           0 :                   if (omos(nx, ny, loc(1, ichan,irow),support)) then
    1938           0 :                      do ipol=1, nvispol
    1939           0 :                         apol=polmap(ipol)+1
    1940           0 :                         aconvpol=convpolmap(ipol)+1
    1941             :                         if((flag(ipol,ichan,irow).ne.1).and.
    1942           0 :      $                       (apol.ge.1).and.(apol.le.npol)) then
    1943             : C          write(*,*) 'aindices', aconvplane, aconvchan, aconvpol
    1944           0 :                            nvalue=0.0
    1945           0 :                            norm=0.0
    1946           0 :                     cfunc=convfunc(:,:,aconvpol, aconvchan, aconvplane)      
    1947           0 :                               do iy=-support,support
    1948           0 :                                  iloc(2)=sampling*iy+off(2, ichan, irow)
    1949           0 :                                  yind=iloc(2)+(convsize)/2+1
    1950             : C        write(*,*) 'iloc(2)', iloc(2), off(2), yind
    1951           0 :                                  do ix=-support,support
    1952             :                                     iloc(1)=ix*sampling
    1953           0 :      $                                   +off(1, ichan, irow)
    1954           0 :                                     xind=iloc(1)+(convsize)/2+1
    1955             : C        write(*,*) 'iloc(1)', iloc(1), off(1), xind
    1956           0 :                                     cwt=cfunc(xind, yind)
    1957           0 :                                     if(doconj) cwt=conjg(cwt)
    1958             :                                     nvalue=nvalue+cwt*
    1959             :      $                                   grid(loc(1, ichan, irow)+ix,
    1960             :      $                                   loc(2, ichan, irow)+iy,
    1961           0 :      $                                   apol,achan)
    1962             :                                  end do
    1963             :                               end do
    1964             :                           
    1965             :                            values(ipol,ichan,irow)=nvalue*conjg(
    1966           0 :      $                         phasor(ichan, irow))
    1967             :                        end if
    1968             :                      end do
    1969             :                   end if
    1970             :                end if
    1971             :             end do
    1972             :          end if
    1973             :       end do
    1974           0 :       return
    1975             :       end
    1976             : C
    1977             : 
    1978             : 
    1979             : C Calculate gridded coordinates and the phasor needed for
    1980             : C phase rotation. 
    1981             : C
    1982           0 :       subroutine smos (uvw, dphase, freq, c, scale, offset, 
    1983             :      $     sampling, pos, loc, off, phasor)
    1984             :       implicit none
    1985             :       integer loc(2), off(2), sampling
    1986             :       double precision uvw(3), freq, c, scale(2), offset(2)
    1987             :       real pos(2)
    1988             :       double precision dphase, phase
    1989             :       complex phasor
    1990             :       integer idim
    1991             :       double precision pi
    1992             :       data pi/3.14159265358979323846/
    1993             : 
    1994           0 :       do idim=1,2
    1995             :          pos(idim)=scale(idim)*uvw(idim)*freq/c+
    1996           0 :      $        (offset(idim)+1)
    1997           0 :          loc(idim)=nint(pos(idim))
    1998           0 :          if(sampling.gt.1) then
    1999             : C            if((pos(idim)-loc(idim)) < 0.0)then
    2000             : C               loc(idim)=loc(idim)-1
    2001             : C            end if 
    2002           0 :             off(idim)=nint((pos(idim)-real(loc(idim)))*real(-sampling))
    2003             : C            if(off(idim).eq.sampling) then
    2004             : C               off(idim)=0
    2005             : C               loc(idim)=loc(idim)+1
    2006             : C            end if
    2007             :          else
    2008           0 :             off(idim)=0
    2009             :          end if
    2010             :       end do
    2011           0 :       phase=-2.0D0*pi*dphase*freq/c
    2012           0 :       phasor=cmplx(cos(phase), sin(phase))
    2013           0 :       return 
    2014             :       end
    2015             : 
    2016           0 :       logical function omos (nx, ny, loc, support)
    2017             :       implicit none
    2018             :       integer nx, ny, nw, loc(2), support
    2019             :       omos=(loc(1)-support.ge.1).and.(loc(1)+support.le.nx).and.
    2020           0 :      $        (loc(2)-support.ge.1).and.(loc(2)+support.le.ny)
    2021           0 :       return
    2022             :       end
    2023             : 
    2024             : 
    2025           0 :       logical function  onmosgrid(loc, nx, ny, nx0, ny0, 
    2026             :      $                 nxsub, nysub, support, msuppx, msuppy,
    2027             :      $                 psuppx, psuppy, centerin)
    2028             :       implicit none
    2029             :       integer, intent(in) :: nx, ny,  nx0, ny0, nxsub, nysub, loc(2), 
    2030             :      $     support
    2031             :       logical, intent(out) :: centerin
    2032             :       
    2033             :       integer, intent(out) :: msuppx, msuppy, psuppx, psuppy
    2034             :       integer :: loc1sub, loc1plus, loc2sub, loc2plus 
    2035           0 :       msuppx=merge(-support, nx0-loc(1), loc(1)-support >= nx0)
    2036           0 :       msuppy=merge(-support, ny0-loc(2), loc(2)-support >= ny0)
    2037             :       psuppx=merge(support, nx0+nxsub-loc(1)-1 , (loc(1)+support) 
    2038           0 :      $ < (nx0+nxsub))
    2039             :       psuppy=merge(support, ny0+nysub-loc(2)-1 , (loc(2)+support) 
    2040           0 :      $ < (ny0+nysub))
    2041             : C      write(*,*) 'ny0,nysub,loc(2), msuppy',ny0,nysub,loc(2), msuppy,
    2042             : C     $ support, ((loc(2)+support) < (ny0+nysub))
    2043           0 :       loc1sub=loc(1)-support
    2044           0 :       loc1plus=loc(1)+support
    2045           0 :       loc2sub=loc(2)-support
    2046           0 :       loc2plus=loc(2)+support
    2047             :      
    2048             :       centerin=(loc(1).ge.nx0) .and. (loc(1).lt. (nx0+nxsub)).and.
    2049           0 :      $     (loc(2).ge.ny0).and.(loc(2) .lt. (ny0+nysub))
    2050             :       onmosgrid=(loc1plus .ge. nx0) .and. (loc1sub 
    2051             :      $     .le. (nx0+nxsub)) .and.(loc2plus .ge. ny0) .and. 
    2052           0 :      $     (loc2sub .le. (ny0+nysub))
    2053             :       
    2054           0 :       return
    2055             :       end

Generated by: LCOV version 1.16