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: aips2-request@nrao.edu.
23 : * Postal address: AIPS++ Project Office
24 : * National Radio Astronomy Observatory
25 : * 520 Edgemont Road
26 : * Charlottesville, VA 22903-2475 USA
27 : *
28 : * $Id$
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 42195 : subroutine gmoswgtd (nvispol, nvischan,
450 126585 : $ flag, rflag, weight, nrow,
451 : $ nx, ny, npol, nchan,
452 : $ support, convsize, sampling,
453 84390 : $ chanmap, polmap,
454 84390 : $ weightgrid, sumwt, convweight, convplanemap,
455 84390 : $ convchanmap, convpolmap,
456 : $ nconvplane, nconvchan, nconvpol, rbeg,
457 42195 : $ 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 :
489 : integer :: iloc(2)
490 : integer :: iiloc(2)
491 : integer, intent(in) :: rbeg, rend
492 : integer :: ix, iy, iz, ipol, ichan, xind, yind
493 : integer :: apol, achan, aconvplane, irow
494 : integer :: aconvpol, aconvchan, xind2, yind2
495 : integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
496 : logical :: centin
497 :
498 :
499 :
500 :
501 11273493 : do irow=rbeg, rend
502 11231298 : aconvplane=convplanemap(irow)+1
503 11273493 : if(rflag(irow).eq.0) then
504 38277780 : do ichan=1, nvischan
505 27159114 : achan=chanmap(ichan)+1
506 27159114 : aconvchan=convchanmap(ichan)+1
507 27159114 : if((achan.ge.1).and.(achan.le.nchan).and.
508 11118666 : $ (weight(ichan,irow).ne.0.0)) then
509 24394320 : if (onmosgrid(loc(1, ichan, irow), nx, ny, 1, 1,
510 : $ nx, ny, support, msupportx, msupporty,
511 : $ psupportx, psupporty, centin)) then
512 73157148 : do ipol=1, nvispol
513 48771432 : apol=polmap(ipol)+1
514 48771432 : aconvpol=convpolmap(ipol)+1
515 : if((flag(ipol,ichan,irow).ne.1).and.
516 73157148 : $ (apol.ge.1).and.(apol.le.npol)) then
517 : C If we are making a PSF then we don't want to phase
518 : C rotate but we do want to reproject uvw
519 :
520 :
521 44916624 : nweight=cmplx(weight(ichan,irow))
522 : sumwt(apol, achan)=sumwt(apol, achan)+
523 44916624 : $ weight(ichan, irow)
524 :
525 : C norm will be the value we would get for the peak
526 : C at the phase center. We will want to normalize
527 : C the final image by this term.
528 44916624 : norm=0.0
529 : C write(*,*)off
530 1377664644 : do iy=msupporty, psupporty
531 44608931490 : do ix=msupportx, psupportx
532 :
533 43231266846 : xind2=sampling*ix+(convsize)/2+1
534 43231266846 : yind2=sampling*iy+(convsize)/2+1
535 : cwt=convweight(xind2,
536 43231266846 : $ yind2, aconvpol, aconvchan, aconvplane)
537 43231266846 : iiloc(1)=nx/2+1+ix
538 43231266846 : iiloc(2)=ny/2+1+iy
539 : weightgrid(iiloc(1),iiloc(2),
540 : $ apol,achan)= weightgrid(
541 : $ iiloc(1),iiloc(2),apol,achan)
542 44564014866 : $ + nweight*cwt
543 :
544 :
545 : end do
546 : end do
547 :
548 : end if
549 : end do
550 : end if
551 : end if
552 : end do
553 : end if
554 : end do
555 42195 : return
556 : end
557 :
558 : C Single precision weight grid image...Damn you fortran...no templates
559 0 : subroutine gmoswgts (nvispol, nvischan,
560 0 : $ flag, rflag, weight, nrow,
561 : $ nx, ny, npol, nchan,
562 : $ support, convsize, sampling,
563 0 : $ chanmap, polmap,
564 0 : $ weightgrid, sumwt, convweight, convplanemap,
565 0 : $ convchanmap, convpolmap,
566 : $ nconvplane, nconvchan, nconvpol, rbeg,
567 0 : $ rend, loc, off, phasor)
568 :
569 : implicit none
570 : integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
571 :
572 :
573 : integer, intent(in) :: loc(2, nvischan, nrow)
574 : integer, intent(in) :: off(2, nvischan, nrow)
575 : complex, intent(in) :: phasor(nvischan, nrow)
576 : integer, intent(in) :: flag(nvispol, nvischan, nrow)
577 : integer, intent(in) :: rflag(nrow)
578 : real, intent(in) :: weight(nvischan, nrow)
579 : integer, intent(in) :: support
580 : integer, intent(in) :: chanmap(nchan), polmap(npol)
581 : complex, intent(inout) :: weightgrid(nx, ny, npol, nchan)
582 : double precision, intent(inout) :: sumwt(npol, nchan)
583 : complex :: nweight
584 : integer, intent(in) :: convsize, sampling
585 : integer, intent(in) :: nconvplane, nconvchan, nconvpol
586 : integer, intent(in) :: convplanemap(nrow)
587 : integer, intent(in) :: convchanmap(nvischan)
588 : integer, intent(in) :: convpolmap(nvispol)
589 : complex :: cwt
590 : complex, intent(in) :: convweight(convsize, convsize, nconvpol,
591 : $ nconvchan, nconvplane)
592 :
593 :
594 : real :: norm
595 : real :: wt
596 :
597 : logical :: onmosgrid
598 :
599 : integer :: iloc(2)
600 : integer :: iiloc(2)
601 : integer, intent(in) :: rbeg, rend
602 : integer :: ix, iy, iz, ipol, ichan, xind, yind
603 : integer :: apol, achan, aconvplane, irow
604 : integer :: aconvpol, aconvchan, xind2, yind2
605 : integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
606 : logical :: centin
607 :
608 :
609 :
610 :
611 0 : do irow=rbeg, rend
612 0 : aconvplane=convplanemap(irow)+1
613 0 : if(rflag(irow).eq.0) then
614 0 : do ichan=1, nvischan
615 0 : achan=chanmap(ichan)+1
616 0 : aconvchan=convchanmap(ichan)+1
617 0 : if((achan.ge.1).and.(achan.le.nchan).and.
618 0 : $ (weight(ichan,irow).ne.0.0)) then
619 0 : if (onmosgrid(loc(1, ichan, irow), nx, ny, 1, 1,
620 : $ nx, ny, support, msupportx, msupporty,
621 : $ psupportx, psupporty, centin)) then
622 0 : do ipol=1, nvispol
623 0 : apol=polmap(ipol)+1
624 0 : aconvpol=convpolmap(ipol)+1
625 : if((flag(ipol,ichan,irow).ne.1).and.
626 0 : $ (apol.ge.1).and.(apol.le.npol)) then
627 : C If we are making a PSF then we don't want to phase
628 : C rotate but we do want to reproject uvw
629 :
630 :
631 0 : nweight=cmplx(weight(ichan,irow))
632 : sumwt(apol, achan)=sumwt(apol, achan)+
633 0 : $ weight(ichan, irow)
634 :
635 : C norm will be the value we would get for the peak
636 : C at the phase center. We will want to normalize
637 : C the final image by this term.
638 0 : norm=0.0
639 : C write(*,*)off
640 0 : do iy=msupporty, psupporty
641 0 : do ix=msupportx, psupportx
642 :
643 0 : xind2=sampling*ix+(convsize)/2+1
644 0 : yind2=sampling*iy+(convsize)/2+1
645 : cwt=convweight(xind2,
646 0 : $ yind2, aconvpol, aconvchan, aconvplane)
647 0 : iiloc(1)=nx/2+1+ix
648 0 : iiloc(2)=ny/2+1+iy
649 : weightgrid(iiloc(1),iiloc(2),
650 : $ apol,achan)= weightgrid(
651 : $ iiloc(1),iiloc(2),apol,achan)
652 0 : $ + nweight*cwt
653 :
654 :
655 : end do
656 : end do
657 :
658 : end if
659 : end do
660 : end if
661 : end if
662 : end do
663 : end if
664 : end do
665 0 : return
666 : end
667 :
668 :
669 125242 : subroutine sectgmosd2 (values, nvispol, nvischan,
670 187863 : $ dopsf, flag, rflag, weight, nrow,
671 62621 : $ grid, nx, ny, npol, nchan,
672 62621 : $ support, convsize, sampling, convfunc,
673 125242 : $ chanmap, polmap,
674 125242 : $ sumwt, convplanemap,
675 125242 : $ convchanmap, convpolmap,
676 : $ nconvplane, nconvchan, nconvpol, x0, y0, nxsub, nysub, rbeg,
677 125242 : $ rend, loc, off, phasor)
678 :
679 : implicit none
680 : integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
681 : complex, intent(in) :: values(nvispol, nvischan, nrow)
682 : double complex, intent(inout) :: grid(nx, ny, npol, nchan)
683 :
684 : integer, intent(in) :: x0, y0, nxsub, nysub
685 : integer, intent(in) :: loc(2, nvischan, nrow)
686 : integer, intent(in) :: off(2, nvischan, nrow)
687 : complex, intent(in) :: phasor(nvischan, nrow)
688 : integer, intent(in) :: flag(nvispol, nvischan, nrow)
689 : integer, intent(in) :: rflag(nrow)
690 : real, intent(in) :: weight(nvischan, nrow)
691 : double precision, intent(inout) :: sumwt(npol, nchan)
692 : integer, intent(in) :: support
693 : integer, intent(in) :: chanmap(nchan), polmap(npol)
694 : integer, intent(in) :: dopsf
695 :
696 : double complex :: nvalue
697 : integer, intent(in) :: convsize, sampling
698 : integer, intent(in) :: nconvplane, nconvchan, nconvpol
699 : integer, intent(in) :: convplanemap(nrow)
700 : integer, intent(in) :: convchanmap(nvischan)
701 : integer, intent(in) :: convpolmap(nvispol)
702 : complex, intent(in) :: convfunc(convsize, convsize, nconvpol,
703 : $ nconvchan, nconvplane)
704 : complex :: cwt
705 :
706 :
707 : real :: norm
708 : real :: wt
709 :
710 : logical :: onmosgrid
711 :
712 : integer :: iloc(2)
713 : integer :: iiloc(2)
714 : integer, intent(in) :: rbeg, rend
715 : integer :: ix, iy, iz, ipol, ichan, xind, yind
716 : integer :: apol, achan, aconvplane, irow
717 : integer :: aconvpol, aconvchan, xind2, yind2
718 : integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
719 : logical :: centin
720 :
721 :
722 :
723 :
724 13725185 : do irow=rbeg, rend
725 13662564 : aconvplane=convplanemap(irow)+1
726 13725185 : if(rflag(irow).eq.0) then
727 45332740 : do ichan=1, nvischan
728 31792244 : achan=chanmap(ichan)+1
729 31792244 : aconvchan=convchanmap(ichan)+1
730 31792244 : if((achan.ge.1).and.(achan.le.nchan).and.
731 13540496 : $ (weight(ichan,irow).ne.0.0)) then
732 29020181 : if (onmosgrid(loc(1, ichan, irow), nx, ny, x0, y0,
733 : $ nxsub, nysub, support, msupportx, msupporty,
734 : $ psupportx, psupporty, centin)) then
735 87020355 : do ipol=1, nvispol
736 58013570 : apol=polmap(ipol)+1
737 58013570 : aconvpol=convpolmap(ipol)+1
738 : if((flag(ipol,ichan,irow).ne.1).and.
739 87020355 : $ (apol.ge.1).and.(apol.le.npol)) then
740 : C If we are making a PSF then we don't want to phase
741 : C rotate but we do want to reproject uvw
742 54158762 : if(dopsf.eq.1) then
743 24368476 : nvalue=cmplx(weight(ichan,irow))
744 : else
745 : nvalue=weight(ichan,irow)*
746 29790286 : $ (values(ipol,ichan,irow)*phasor(ichan, irow))
747 : end if
748 :
749 :
750 : C norm will be the value we would get for the peak
751 : C at the phase center. We will want to normalize
752 : C the final image by this term.
753 54158762 : norm=0.0
754 1667673680 : do iy=msupporty, psupporty
755 : iloc(2)=(sampling*iy)+
756 1613514918 : $ off(2, ichan, irow)
757 1613514918 : yind=iloc(2)+(convsize)/2+1
758 53984658888 : do ix=msupportx, psupportx
759 : iloc(1)=(sampling*ix)+
760 52316985208 : $ off(1, ichan, irow)
761 52316985208 : xind=iloc(1)+(convsize)/2+1
762 : cwt=convfunc(xind, yind,
763 52316985208 : $ aconvpol, aconvchan, aconvplane)
764 : C write(*,*) support, iloc
765 : C write(*,*) loc(1, ichan, irow)+ix,loc(2, ichan, irow)+iy,xind,yind
766 : grid(loc(1, ichan, irow)+ix,
767 : $ loc(2, ichan, irow)+iy,apol,achan)=
768 : $ grid(loc(1, ichan, irow)+ix,
769 : $ loc(2, ichan, irow)+iy,apol,achan)+
770 53930500126 : $ nvalue*cwt
771 : end do
772 : end do
773 54158762 : if(centin) then
774 : sumwt(apol, achan)= sumwt(apol,achan)+
775 54154754 : $ weight(ichan,irow)
776 : endif
777 : end if
778 : end do
779 : C if onmos
780 : end if
781 : end if
782 : end do
783 : end if
784 : end do
785 62621 : return
786 : end
787 : C Single Precision version
788 0 : subroutine sectgmoss2 (values, nvispol, nvischan,
789 0 : $ dopsf, flag, rflag, weight, nrow,
790 0 : $ grid, nx, ny, npol, nchan,
791 0 : $ support, convsize, sampling, convfunc,
792 0 : $ chanmap, polmap,
793 0 : $ sumwt, convplanemap,
794 0 : $ convchanmap, convpolmap,
795 : $ nconvplane, nconvchan, nconvpol, x0, y0, nxsub, nysub, rbeg,
796 0 : $ rend, loc, off, phasor)
797 :
798 : implicit none
799 : integer, intent(in) :: nx,ny,npol,nchan, nvispol, nvischan, nrow
800 : complex, intent(in) :: values(nvispol, nvischan, nrow)
801 : complex, intent(inout) :: grid(nx, ny, npol, nchan)
802 :
803 : integer, intent(in) :: x0, y0, nxsub, nysub
804 : integer, intent(in) :: loc(2, nvischan, nrow)
805 : integer, intent(in) :: off(2, nvischan, nrow)
806 : complex, intent(in) :: phasor(nvischan, nrow)
807 : integer, intent(in) :: flag(nvispol, nvischan, nrow)
808 : integer, intent(in) :: rflag(nrow)
809 : real, intent(in) :: weight(nvischan, nrow)
810 : double precision, intent(inout) :: sumwt(npol, nchan)
811 : integer, intent(in) :: support
812 : integer, intent(in) :: chanmap(nchan), polmap(npol)
813 : integer, intent(in) :: dopsf
814 :
815 : complex :: nvalue
816 : integer, intent(in) :: convsize, sampling
817 : integer, intent(in) :: nconvplane, nconvchan, nconvpol
818 : integer, intent(in) :: convplanemap(nrow)
819 : integer, intent(in) :: convchanmap(nvischan)
820 : integer, intent(in) :: convpolmap(nvispol)
821 : complex, intent(in) :: convfunc(convsize, convsize, nconvpol,
822 : $ nconvchan, nconvplane)
823 : complex :: cwt
824 :
825 :
826 : real :: norm
827 : real :: wt
828 :
829 : logical :: onmosgrid
830 :
831 : integer :: iloc(2)
832 : integer :: iiloc(2)
833 : integer, intent(in) :: rbeg, rend
834 : integer :: ix, iy, iz, ipol, ichan, xind, yind
835 : integer :: apol, achan, aconvplane, irow
836 : integer :: aconvpol, aconvchan, xind2, yind2
837 : integer :: posx, posy, msupportx, msupporty, psupportx, psupporty
838 : logical :: centin
839 :
840 :
841 :
842 :
843 0 : do irow=rbeg, rend
844 0 : aconvplane=convplanemap(irow)+1
845 0 : if(rflag(irow).eq.0) then
846 0 : do ichan=1, nvischan
847 0 : achan=chanmap(ichan)+1
848 0 : aconvchan=convchanmap(ichan)+1
849 0 : if((achan.ge.1).and.(achan.le.nchan).and.
850 0 : $ (weight(ichan,irow).ne.0.0)) then
851 0 : if (onmosgrid(loc(1, ichan, irow), nx, ny, x0, y0,
852 : $ nxsub, nysub, support, msupportx, msupporty,
853 : $ psupportx, psupporty, centin)) then
854 0 : do ipol=1, nvispol
855 0 : apol=polmap(ipol)+1
856 0 : aconvpol=convpolmap(ipol)+1
857 : if((flag(ipol,ichan,irow).ne.1).and.
858 0 : $ (apol.ge.1).and.(apol.le.npol)) then
859 : C If we are making a PSF then we don't want to phase
860 : C rotate but we do want to reproject uvw
861 0 : if(dopsf.eq.1) then
862 0 : nvalue=cmplx(weight(ichan,irow))
863 : else
864 : nvalue=weight(ichan,irow)*
865 0 : $ (values(ipol,ichan,irow)*phasor(ichan, irow))
866 : end if
867 :
868 :
869 : C norm will be the value we would get for the peak
870 : C at the phase center. We will want to normalize
871 : C the final image by this term.
872 0 : norm=0.0
873 0 : do iy=msupporty, psupporty
874 : iloc(2)=(sampling*iy)+
875 0 : $ off(2, ichan, irow)
876 0 : yind=iloc(2)+(convsize)/2+1
877 0 : do ix=msupportx, psupportx
878 : iloc(1)=(sampling*ix)+
879 0 : $ off(1, ichan, irow)
880 0 : xind=iloc(1)+(convsize)/2+1
881 : cwt=convfunc(xind, yind,
882 0 : $ aconvpol, aconvchan, aconvplane)
883 : C write(*,*) support, iloc
884 : grid(loc(1, ichan, irow)+ix,
885 : $ loc(2, ichan, irow)+iy,apol,achan)=
886 : $ grid(loc(1, ichan, irow)+ix,
887 : $ loc(2, ichan, irow)+iy,apol,achan)+
888 0 : $ nvalue*cwt
889 : end do
890 : end do
891 0 : if(centin) then
892 : sumwt(apol, achan)= sumwt(apol,achan)+
893 0 : $ weight(ichan,irow)
894 : end if
895 : end if
896 : end do
897 : end if
898 : end if
899 : end do
900 : end if
901 : end do
902 0 : return
903 : end
904 : C
905 :
906 :
907 0 : subroutine gmoss (uvw, dphase, values, nvispol, nvischan,
908 0 : $ dopsf, flag, rflag, weight, nrow, rownum,
909 0 : $ scale, offset, grid, nx, ny, npol, nchan, freq, c,
910 0 : $ support, convsize, sampling, convfunc,
911 0 : $ chanmap, polmap,
912 0 : $ sumwt, weightgrid, convweight, doweightgrid, convplanemap,
913 : $ nconvplane)
914 :
915 : implicit none
916 : integer nx, ny, npol, nchan, nvispol, nvischan, nrow
917 : complex values(nvispol, nvischan, nrow)
918 : complex grid(nx, ny, npol, nchan)
919 :
920 : double precision uvw(3, nrow), freq(nvischan), c, scale(2),
921 : $ offset(2)
922 : double precision dphase(nrow), uvdist
923 : double precision xlast, ylast
924 : complex phasor
925 : integer flag(nvispol, nvischan, nrow)
926 : integer rflag(nrow)
927 : real weight(nvischan, nrow), phase
928 : double precision sumwt(npol, nchan)
929 : integer rownum
930 : integer support
931 : integer chanmap(nchan), polmap(npol)
932 : integer dopsf
933 : complex weightgrid(nx, ny, npol, nchan)
934 : integer doweightgrid
935 :
936 : complex nvalue
937 : complex nweight
938 : integer convsize, sampling
939 : integer nconvplane
940 : integer convplanemap(nrow)
941 : complex convfunc(convsize, convsize, nconvplane), cwt, crot
942 : complex convweight(convsize, convsize, nconvplane)
943 :
944 :
945 : complex sconv(-(support+1)*sampling:(support+1)*sampling,
946 0 : $ -(support+1)*sampling:(support+1)*sampling, nconvplane)
947 : complex sconv2(-(support+1)*sampling:(support+1)*sampling,
948 0 : $ -(support+1)*sampling:(support+1)*sampling, nconvplane)
949 : real sumsconv
950 : real sumsconv2
951 : real ratioofbeam
952 :
953 : real norm
954 : real wt
955 :
956 : logical omos, doshift
957 :
958 : real pos(3)
959 : integer loc(2), off(2), iloc(2)
960 : integer iiloc(2)
961 : integer rbeg, rend
962 : integer ix, iy, iz, ipol, ichan
963 : integer apol, achan, aconvplane, irow
964 : double precision pi
965 : data pi/3.14159265358979323846/
966 : integer sampsupp
967 0 : sampsupp=(support+1)*sampling
968 0 : irow=rownum
969 :
970 0 : sumsconv=0
971 0 : sumsconv2=0
972 0 : ratioofbeam=1.0
973 0 : do iz=1, nconvplane
974 0 : do iy=-sampsupp,sampsupp
975 0 : iloc(2)=iy+convsize/2+1
976 0 : do ix=-sampsupp,sampsupp
977 0 : iloc(1)=ix+convsize/2+1
978 0 : sconv(ix,iy,iz)=(convfunc(iloc(1), iloc(2),iz))
979 0 : sconv2(ix,iy,iz)=convweight(iloc(1), iloc(2),iz)
980 : end do
981 : end do
982 : end do
983 0 : doshift=.FALSE.
984 :
985 0 : if(irow.ge.0) then
986 0 : rbeg=irow+1
987 0 : rend=irow+1
988 : else
989 0 : rbeg=1
990 0 : rend=nrow
991 : end if
992 :
993 0 : xlast=0.0
994 0 : ylast=0.0
995 0 : do irow=rbeg, rend
996 0 : aconvplane=convplanemap(irow)+1
997 0 : if(rflag(irow).eq.0) then
998 0 : do ichan=1, nvischan
999 0 : achan=chanmap(ichan)+1
1000 0 : if((achan.ge.1).and.(achan.le.nchan).and.
1001 0 : $ (weight(ichan,irow).ne.0.0)) then
1002 : call smos(uvw(1,irow), dphase(irow), freq(ichan), c,
1003 0 : $ scale, offset, sampling, pos, loc, off, phasor)
1004 0 : if (omos(nx, ny, loc, support)) then
1005 0 : do ipol=1, nvispol
1006 0 : apol=polmap(ipol)+1
1007 : if((flag(ipol,ichan,irow).ne.1).and.
1008 0 : $ (apol.ge.1).and.(apol.le.npol)) then
1009 : C If we are making a PSF then we don't want to phase
1010 : C rotate but we do want to reproject uvw
1011 0 : if(dopsf.eq.1) then
1012 0 : nvalue=cmplx(weight(ichan,irow))
1013 : else
1014 : nvalue=weight(ichan,irow)*
1015 0 : $ (values(ipol,ichan,irow)*phasor)
1016 : end if
1017 0 : if(doweightgrid .gt. 0) then
1018 0 : nweight=cmplx(weight(ichan,irow))
1019 : end if
1020 :
1021 : C norm will be the value we would get for the peak
1022 : C at the phase center. We will want to normalize
1023 : C the final image by this term.
1024 0 : norm=0.0
1025 0 : if(sampling.eq.1) then
1026 0 : do iy=-support,support
1027 0 : do ix=-support,support
1028 : grid(loc(1)+ix,
1029 : $ loc(2)+iy,apol,achan)=
1030 : $ grid(loc(1)+ix,
1031 : $ loc(2)+iy,apol,achan)+
1032 0 : $ nvalue*sconv(ix,iy, aconvplane)
1033 :
1034 0 : if(doweightgrid .gt. 0) then
1035 0 : iloc(1)=nx/2+1+ix
1036 0 : iloc(2)=ny/2+1+iy
1037 : weightgrid(iloc(1),iloc(2),
1038 : $ apol,achan)= weightgrid(
1039 : $ iloc(1),iloc(2),apol,achan)
1040 0 : $ + nweight*sconv2(ix,iy,aconvplane)
1041 :
1042 : end if
1043 : end do
1044 : end do
1045 : else
1046 0 : do iy=-support,support
1047 0 : iloc(2)=(sampling*iy+off(2))+1
1048 0 : do ix=-support, support
1049 0 : iloc(1)=(sampling*ix+off(1))+1
1050 : cwt=sconv(iloc(1),
1051 0 : $ iloc(2),aconvplane)
1052 : grid(loc(1)+ix,
1053 : $ loc(2)+iy,apol,achan)=
1054 : $ grid(loc(1)+ix,
1055 : $ loc(2)+iy,apol,achan)+
1056 0 : $ nvalue*cwt
1057 0 : if(doweightgrid .gt. 0) then
1058 : cwt=sconv2(iloc(1), iloc(2),
1059 0 : $ aconvplane)
1060 0 : iiloc(1)=nx/2+1+ix
1061 0 : iiloc(2)=ny/2+1+iy
1062 : weightgrid(iiloc(1),iiloc(2),
1063 : $ apol,achan)= weightgrid(
1064 : $ iiloc(1),iiloc(2),apol,achan)
1065 0 : $ + nweight*cwt
1066 :
1067 : end if
1068 : end do
1069 : end do
1070 : end if
1071 : sumwt(apol, achan)= sumwt(apol,achan)+
1072 0 : $ weight(ichan,irow)
1073 : end if
1074 : end do
1075 : end if
1076 : end if
1077 : end do
1078 : end if
1079 : end do
1080 0 : return
1081 : end
1082 : C
1083 0 : subroutine gmoss2 (uvw, dphase, values, nvispol, nvischan,
1084 0 : $ dopsf, flag, rflag, weight, nrow, rownum,
1085 0 : $ scale, offset, grid, nx, ny, npol, nchan, freq, c,
1086 0 : $ support, convsize, sampling, convfunc,
1087 0 : $ chanmap, polmap,
1088 0 : $ sumwt, weightgrid, convweight, doweightgrid, convplanemap,
1089 0 : $ convchanmap, convpolmap,
1090 : $ nconvplane, nconvchan, nconvpol)
1091 :
1092 : implicit none
1093 : integer nx, ny, npol, nchan, nvispol, nvischan, nrow
1094 : complex values(nvispol, nvischan, nrow)
1095 : complex grid(nx, ny, npol, nchan)
1096 :
1097 : double precision uvw(3, nrow), freq(nvischan), c, scale(2),
1098 : $ offset(2)
1099 : double precision dphase(nrow), uvdist
1100 : double precision xlast, ylast
1101 : complex phasor
1102 : integer flag(nvispol, nvischan, nrow)
1103 : integer rflag(nrow)
1104 : real weight(nvischan, nrow), phase
1105 : double precision sumwt(npol, nchan)
1106 : integer rownum
1107 : integer support
1108 : integer chanmap(nchan), polmap(npol)
1109 : integer dopsf
1110 : complex weightgrid(nx, ny, npol, nchan)
1111 : integer doweightgrid
1112 :
1113 : double complex nvalue
1114 : double complex nweight
1115 : integer convsize, sampling
1116 : integer nconvplane, nconvchan, nconvpol
1117 : integer convplanemap(nrow)
1118 : integer convchanmap(nvischan)
1119 : integer convpolmap(nvispol)
1120 : complex convfunc(convsize, convsize, nconvpol, nconvchan,
1121 : $ nconvplane), cwt, crot
1122 : complex convweight(convsize, convsize, nconvpol, nconvchan,
1123 : $ nconvplane)
1124 : real sumsconv
1125 : real sumsconv2
1126 : real ratioofbeam
1127 :
1128 : real norm
1129 : real wt
1130 :
1131 : logical omos, doshift
1132 :
1133 : real pos(3)
1134 : integer loc(2), off(2), iloc(2)
1135 : integer iiloc(2)
1136 : integer rbeg, rend
1137 : integer ix, iy, iz, ipol, ichan, xind, yind
1138 : integer apol, achan, aconvplane, irow
1139 : integer aconvpol, aconvchan, xind2, yind2
1140 : double precision pi
1141 : data pi/3.14159265358979323846/
1142 : real maxsconv2, minsconv2
1143 0 : irow=rownum
1144 :
1145 0 : sumsconv=0
1146 0 : sumsconv2=0
1147 0 : ratioofbeam=1.0
1148 :
1149 0 : doshift=.FALSE.
1150 :
1151 0 : if(irow.ge.0) then
1152 0 : rbeg=irow+1
1153 0 : rend=irow+1
1154 : else
1155 0 : rbeg=1
1156 0 : rend=nrow
1157 : end if
1158 :
1159 : C write(*,*) 'max of sconvs ', maxsconv2, minsconv2, sampsupp,
1160 : C $ convsize
1161 :
1162 :
1163 :
1164 0 : xlast=0.0
1165 0 : ylast=0.0
1166 0 : do irow=rbeg, rend
1167 0 : aconvplane=convplanemap(irow)+1
1168 0 : if(rflag(irow).eq.0) then
1169 0 : do ichan=1, nvischan
1170 0 : achan=chanmap(ichan)+1
1171 0 : aconvchan=convchanmap(ichan)+1
1172 0 : if((achan.ge.1).and.(achan.le.nchan).and.
1173 0 : $ (weight(ichan,irow).ne.0.0)) then
1174 : call smos(uvw(1,irow), dphase(irow), freq(ichan), c,
1175 0 : $ scale, offset, sampling, pos, loc, off, phasor)
1176 0 : if (omos(nx, ny, loc, support)) then
1177 0 : do ipol=1, nvispol
1178 0 : apol=polmap(ipol)+1
1179 0 : aconvpol=convpolmap(ipol)+1
1180 : if((flag(ipol,ichan,irow).ne.1).and.
1181 0 : $ (apol.ge.1).and.(apol.le.npol)) then
1182 : C If we are making a PSF then we don't want to phase
1183 : C rotate but we do want to reproject uvw
1184 0 : if(dopsf.eq.1) then
1185 0 : nvalue=cmplx(weight(ichan,irow))
1186 : else
1187 : nvalue=weight(ichan,irow)*
1188 0 : $ (values(ipol,ichan,irow)*phasor)
1189 : end if
1190 0 : if(doweightgrid .gt. 0) then
1191 0 : nweight=cmplx(weight(ichan,irow))
1192 : end if
1193 :
1194 : C norm will be the value we would get for the peak
1195 : C at the phase center. We will want to normalize
1196 : C the final image by this term.
1197 0 : norm=0.0
1198 0 : if(sampling.eq.1) then
1199 0 : do iy=-support,support
1200 0 : yind=iy+(convsize)/2+1
1201 0 : do ix=-support,support
1202 0 : xind=ix+(convsize)/2+1
1203 : grid(loc(1)+ix,
1204 : $ loc(2)+iy,apol,achan)=
1205 : $ grid(loc(1)+ix,
1206 : $ loc(2)+iy,apol,achan)+
1207 : $ nvalue*convfunc(xind, yind,
1208 0 : $ aconvpol, aconvchan, aconvplane)
1209 :
1210 0 : if(doweightgrid .gt. 0) then
1211 0 : iloc(1)=nx/2+1+ix
1212 0 : iloc(2)=ny/2+1+iy
1213 : weightgrid(iloc(1),iloc(2),
1214 : $ apol,achan)= weightgrid(
1215 : $ iloc(1),iloc(2),apol,achan)
1216 : $ + nweight*convweight(xind, yind,
1217 0 : $ aconvpol, aconvchan, aconvplane)
1218 :
1219 : end if
1220 : end do
1221 : end do
1222 : else
1223 : C write(*,*)off
1224 0 : do iy=-support, support
1225 0 : iloc(2)=(sampling*iy)+off(2)
1226 0 : yind=iloc(2)+(convsize)/2+1
1227 0 : do ix=-support, support
1228 0 : iloc(1)=(sampling*ix)+off(1)
1229 0 : xind=iloc(1)+(convsize)/2+1
1230 : cwt=convfunc(xind, yind,
1231 0 : $ aconvpol, aconvchan, aconvplane)
1232 : C write(*,*) yind, xind, loc(1)+ix, loc(2)+iy, apol, achan,
1233 : C $ aconvpol, aconvchan, aconvplane
1234 : grid(loc(1)+ix,
1235 : $ loc(2)+iy,apol,achan)=
1236 : $ grid(loc(1)+ix,
1237 : $ loc(2)+iy,apol,achan)+
1238 0 : $ nvalue*cwt
1239 0 : if(doweightgrid .gt. 0) then
1240 0 : xind2=sampling*ix+(convsize)/2+1
1241 0 : yind2=sampling*iy+(convsize)/2+1
1242 : cwt=convweight(xind2,
1243 : $ yind2, aconvpol, aconvchan,
1244 0 : $ aconvplane)
1245 0 : iiloc(1)=nx/2+1+ix
1246 0 : iiloc(2)=ny/2+1+iy
1247 : weightgrid(iiloc(1),iiloc(2),
1248 : $ apol,achan)= weightgrid(
1249 : $ iiloc(1),iiloc(2),apol,achan)
1250 0 : $ + nweight*cwt
1251 :
1252 : end if
1253 : end do
1254 : end do
1255 : end if
1256 : sumwt(apol, achan)= sumwt(apol,achan)+
1257 0 : $ weight(ichan,irow)
1258 : end if
1259 : end do
1260 : end if
1261 : end if
1262 : end do
1263 : end if
1264 : end do
1265 0 : return
1266 : end
1267 : C
1268 :
1269 :
1270 :
1271 : C Degrid a number of visibility records
1272 : C
1273 0 : subroutine dmos (uvw, dphase, values, nvispol, nvischan,
1274 0 : $ flag, rflag,
1275 0 : $ nrow, rownum, scale, offset, grid, nx, ny, npol, nchan, freq,
1276 0 : $ c, support, convsize, sampling, convfunc,
1277 0 : $ chanmap, polmap, convplanemap, nconvplane)
1278 :
1279 : implicit none
1280 : integer nx, ny, npol, nchan, nvispol, nvischan, nrow
1281 : integer nconvplane
1282 : complex values(nvispol, nvischan, nrow)
1283 : complex grid(nx, ny, npol, nchan)
1284 : double precision uvw(3, nrow), freq(nvischan), c, scale(2),
1285 : $ offset(2)
1286 : double precision dphase(nrow), uvdist
1287 : double precision xlast, ylast
1288 : complex phasor
1289 : integer flag(nvispol, nvischan, nrow)
1290 : integer rflag(nrow)
1291 : integer rownum
1292 : integer support
1293 : integer chanmap(nchan), polmap(npol)
1294 : integer convplanemap(nrow)
1295 : complex nvalue
1296 :
1297 : integer convsize, sampling
1298 : complex convfunc(convsize, convsize, nconvplane), cwt, crot
1299 :
1300 : integer sampsupp
1301 :
1302 : complex sconv(-(support+1)*sampling:(support+1)*sampling,
1303 0 : $ -(support+1)*sampling:(support+1)*sampling, nconvplane)
1304 :
1305 : real norm, phase
1306 :
1307 : logical omos, doshift
1308 :
1309 : real pos(2)
1310 : integer loc(2), off(2), iloc(2)
1311 : integer rbeg, rend
1312 : integer ix, iy, iz, ipol, ichan
1313 : integer apol, achan, aconvplane, irow
1314 : real wt, wtx, wty
1315 : double precision pi
1316 : data pi/3.14159265358979323846/
1317 :
1318 0 : sampsupp=(support+1)*sampling
1319 0 : irow=rownum
1320 :
1321 0 : do iz=1, nconvplane
1322 0 : do iy=-sampsupp,sampsupp
1323 0 : iloc(2)=iy+convsize/2+1
1324 0 : do ix=-sampsupp,sampsupp
1325 0 : iloc(1)=ix+convsize/2+1
1326 0 : sconv(ix,iy,iz)=conjg(convfunc(iloc(1), iloc(2),iz))
1327 : end do
1328 : end do
1329 : end do
1330 0 : doshift=.FALSE.
1331 :
1332 0 : if(irow.ge.0) then
1333 0 : rbeg=irow+1
1334 0 : rend=irow+1
1335 : else
1336 0 : rbeg=1
1337 0 : rend=nrow
1338 : end if
1339 : C
1340 0 : xlast=0.0
1341 0 : ylast=0.0
1342 0 : do irow=rbeg, rend
1343 0 : aconvplane=convplanemap(irow)+1
1344 0 : if(rflag(irow).eq.0) then
1345 0 : do ichan=1, nvischan
1346 0 : achan=chanmap(ichan)+1
1347 0 : if((achan.ge.1).and.(achan.le.nchan)) then
1348 : call smos(uvw(1,irow), dphase(irow), freq(ichan), c,
1349 0 : $ scale, offset, sampling, pos, loc, off, phasor)
1350 0 : if (omos(nx, ny, loc, support)) then
1351 0 : do ipol=1, nvispol
1352 0 : apol=polmap(ipol)+1
1353 : if((flag(ipol,ichan,irow).ne.1).and.
1354 0 : $ (apol.ge.1).and.(apol.le.npol)) then
1355 0 : nvalue=0.0
1356 0 : norm=0.0
1357 0 : if(sampling.eq.1) then
1358 0 : do iy=-support,support
1359 0 : do ix=-support,support
1360 : nvalue=nvalue+(sconv(ix,iy,
1361 : $ aconvplane))*
1362 : $ grid(loc(1)+ix,loc(2)+iy,
1363 0 : $ apol,achan)
1364 : end do
1365 : end do
1366 : else
1367 0 : do iy=-support,support
1368 0 : iloc(2)=sampling*iy+off(2)
1369 0 : do ix=-support,support
1370 : iloc(1)=ix*sampling
1371 0 : $ +off(1)
1372 : cwt=sconv(iloc(1),
1373 0 : $ iloc(2),aconvplane)
1374 : nvalue=nvalue+cwt*
1375 : $ grid(loc(1)+ix,loc(2)+iy,
1376 0 : $ apol,achan)
1377 : end do
1378 : end do
1379 : end if
1380 : values(ipol,ichan,irow)=nvalue*conjg(
1381 0 : $ phasor)
1382 : end if
1383 : end do
1384 : end if
1385 : end if
1386 : end do
1387 : end if
1388 : end do
1389 0 : return
1390 : end
1391 : C
1392 :
1393 : C Degrid a number of visibility records
1394 : C
1395 0 : subroutine dmos2 (uvw, dphase, values, nvispol, nvischan,
1396 0 : $ flag, rflag,
1397 0 : $ nrow, rownum, scale, offset, grid, nx, ny, npol, nchan, freq,
1398 0 : $ c, support, convsize, sampling, convfunc,
1399 0 : $ chanmap, polmap, convplanemap, convchanmap, convpolmap,
1400 : $ nconvplane, nconvchan, nconvpol)
1401 :
1402 : implicit none
1403 : integer nx, ny, npol, nchan, nvispol, nvischan, nrow
1404 : integer nconvplane, nconvchan, nconvpol
1405 : complex values(nvispol, nvischan, nrow)
1406 : complex grid(nx, ny, npol, nchan)
1407 : double precision uvw(3, nrow), freq(nvischan), c, scale(2),
1408 : $ offset(2)
1409 : double precision dphase(nrow), uvdist
1410 : double precision xlast, ylast
1411 : complex phasor
1412 : integer flag(nvispol, nvischan, nrow)
1413 : integer rflag(nrow)
1414 : integer rownum
1415 : integer support
1416 : integer chanmap(nchan), polmap(npol)
1417 : integer convplanemap(nrow), convchanmap(nvischan)
1418 : integer convpolmap(nvispol)
1419 : complex nvalue
1420 :
1421 : integer convsize, sampling
1422 : complex convfunc(convsize, convsize, nconvpol, nconvchan,
1423 : $ nconvplane), cwt, crot
1424 :
1425 : integer sampsupp
1426 :
1427 : C complex sconv(-(support+1)*sampling:(support+1)*sampling,
1428 : C $ -(support+1)*sampling:(support+1)*sampling, nconvplane)
1429 :
1430 : real norm, phase
1431 :
1432 : logical omos, doshift
1433 :
1434 : real pos(2)
1435 : integer loc(2), off(2), iloc(2)
1436 : integer rbeg, rend
1437 : integer ix, iy, iz, ipol, ichan, xind, yind
1438 : integer apol, achan, aconvplane, irow
1439 : integer aconvchan, aconvpol
1440 : real wt, wtx, wty
1441 : double precision pi
1442 : data pi/3.14159265358979323846/
1443 :
1444 0 : sampsupp=(support+1)*sampling
1445 0 : irow=rownum
1446 :
1447 : C do iz=1, nconvplane
1448 : C do iy=-sampsupp,sampsupp
1449 : C iloc(2)=iy+convsize/2+1
1450 : c do ix=-sampsupp,sampsupp
1451 : C iloc(1)=ix+convsize/2+1
1452 : C sconv(ix,iy,iz)=conjg(convfunc(iloc(1), iloc(2),iz))
1453 : C end do
1454 : C end do
1455 : C end do
1456 0 : doshift=.FALSE.
1457 :
1458 0 : if(irow.ge.0) then
1459 0 : rbeg=irow+1
1460 0 : rend=irow+1
1461 : else
1462 0 : rbeg=1
1463 0 : rend=nrow
1464 : end if
1465 : C
1466 0 : xlast=0.0
1467 0 : ylast=0.0
1468 0 : do irow=rbeg, rend
1469 0 : aconvplane=convplanemap(irow)+1
1470 0 : if(rflag(irow).eq.0) then
1471 0 : do ichan=1, nvischan
1472 0 : achan=chanmap(ichan)+1
1473 0 : aconvchan=convchanmap(ichan)+1
1474 0 : if((achan.ge.1).and.(achan.le.nchan)) then
1475 : call smos(uvw(1,irow), dphase(irow), freq(ichan), c,
1476 0 : $ scale, offset, sampling, pos, loc, off, phasor)
1477 0 : if (omos(nx, ny, loc, support)) then
1478 0 : do ipol=1, nvispol
1479 0 : apol=polmap(ipol)+1
1480 0 : aconvpol=convpolmap(ipol)+1
1481 : if((flag(ipol,ichan,irow).ne.1).and.
1482 0 : $ (apol.ge.1).and.(apol.le.npol)) then
1483 : C write(*,*) 'aindices', aconvplane, aconvchan, aconvpol
1484 0 : nvalue=0.0
1485 0 : norm=0.0
1486 0 : if(sampling.eq.1) then
1487 0 : do iy=-support,support
1488 0 : yind=iy+(convsize)/2+1
1489 0 : do ix=-support,support
1490 0 : xind=ix+(convsize)/2+1
1491 : nvalue=nvalue+(convfunc(xind,yind,
1492 : $ aconvpol, aconvchan,
1493 : $ aconvplane))*
1494 : $ grid(loc(1)+ix,loc(2)+iy,
1495 0 : $ apol,achan)
1496 : end do
1497 : end do
1498 : else
1499 0 : do iy=-support,support
1500 0 : iloc(2)=sampling*iy+off(2)
1501 0 : yind=iloc(2)+(convsize)/2+1
1502 : C write(*,*) 'iloc(2)', iloc(2), off(2), yind
1503 0 : do ix=-support,support
1504 : iloc(1)=ix*sampling
1505 0 : $ +off(1)
1506 0 : xind=iloc(1)+(convsize)/2+1
1507 : C write(*,*) 'iloc(1)', iloc(1), off(1), xind
1508 : cwt=convfunc(xind, yind, aconvpol,
1509 0 : $ aconvchan,aconvplane)
1510 : nvalue=nvalue+cwt*
1511 : $ grid(loc(1)+ix,loc(2)+iy,
1512 0 : $ apol,achan)
1513 : end do
1514 : end do
1515 : end if
1516 : values(ipol,ichan,irow)=nvalue*conjg(
1517 0 : $ phasor)
1518 : end if
1519 : end do
1520 : end if
1521 : end if
1522 : end do
1523 : end if
1524 : end do
1525 0 : return
1526 : end
1527 : C
1528 :
1529 : C
1530 39162 : subroutine sectdmos2 (values, nvispol, nvischan,
1531 39162 : $ flag, rflag,
1532 19581 : $ nrow, grid, nx, ny, npol, nchan,
1533 19581 : $ support, convsize, sampling, convfunc,
1534 58743 : $ chanmap, polmap, convplanemap, convchanmap, convpolmap,
1535 58743 : $ nconvplane, nconvchan, nconvpol, rbeg,rend,loc,off,phasor)
1536 :
1537 : implicit none
1538 : integer, intent(in) :: nx, ny,npol,nchan,nvispol, nvischan, nrow
1539 : integer, intent(in) :: nconvplane, nconvchan, nconvpol
1540 : complex, intent(inout) :: values(nvispol, nvischan, nrow)
1541 : complex, intent(in) :: grid(nx, ny, npol, nchan)
1542 : complex, intent(in) :: phasor(nvischan, nrow)
1543 : integer, intent(in) :: flag(nvispol, nvischan, nrow)
1544 : integer, intent(in) :: rflag(nrow)
1545 : integer, intent(in) :: support
1546 : integer, intent(in) :: chanmap(nchan), polmap(npol)
1547 : integer, intent(in) :: convplanemap(nrow), convchanmap(nvischan)
1548 : integer, intent(in) :: convpolmap(nvispol)
1549 : complex :: nvalue
1550 :
1551 : integer, intent(in) :: convsize, sampling
1552 : complex, intent(in) :: convfunc(convsize, convsize, nconvpol,
1553 : $ nconvchan, nconvplane)
1554 : complex :: cwt, crot
1555 :
1556 : C complex sconv(-(support+1)*sampling:(support+1)*sampling,
1557 : C $ -(support+1)*sampling:(support+1)*sampling, nconvplane)
1558 :
1559 : real :: norm, phase
1560 :
1561 : logical :: omos
1562 :
1563 :
1564 : integer, intent(in) :: loc(2, nvischan, nrow),
1565 : $ off(2,nvischan,nrow)
1566 : integer :: iloc(2)
1567 : integer, intent(in) :: rbeg, rend
1568 : integer :: ix, iy, iz, ipol, ichan, xind, yind
1569 : integer :: apol, achan, aconvplane, irow
1570 : integer :: aconvchan, aconvpol
1571 : real :: wt, wtx, wty
1572 :
1573 :
1574 2964291 : do irow=rbeg, rend
1575 2944710 : aconvplane=convplanemap(irow)+1
1576 2964291 : if(rflag(irow).eq.0) then
1577 9353790 : do ichan=1, nvischan
1578 6456744 : achan=chanmap(ichan)+1
1579 6456744 : aconvchan=convchanmap(ichan)+1
1580 9353790 : if((achan.ge.1).and.(achan.le.nchan)) then
1581 6456744 : if (omos(nx, ny, loc(1, ichan,irow),support)) then
1582 19359837 : do ipol=1, nvispol
1583 12906558 : apol=polmap(ipol)+1
1584 12906558 : aconvpol=convpolmap(ipol)+1
1585 : if((flag(ipol,ichan,irow).ne.1).and.
1586 19359837 : $ (apol.ge.1).and.(apol.le.npol)) then
1587 : C write(*,*) 'aindices', aconvplane, aconvchan, aconvpol
1588 12815514 : nvalue=0.0
1589 12815514 : norm=0.0
1590 :
1591 273831044 : do iy=-support,support
1592 261015530 : iloc(2)=sampling*iy+off(2, ichan, irow)
1593 261015530 : yind=iloc(2)+(convsize)/2+1
1594 : C write(*,*) 'iloc(2)', iloc(2), off(2), yind
1595 8121239326 : do ix=-support,support
1596 : iloc(1)=ix*sampling
1597 7847408282 : $ +off(1, ichan, irow)
1598 7847408282 : xind=iloc(1)+(convsize)/2+1
1599 : C write(*,*) 'iloc(1)', iloc(1), off(1), xind
1600 : cwt=convfunc(xind, yind, aconvpol,
1601 7847408282 : $ aconvchan,aconvplane)
1602 : nvalue=nvalue+cwt*
1603 : $ grid(loc(1, ichan, irow)+ix,
1604 : $ loc(2, ichan, irow)+iy,
1605 8108423812 : $ apol,achan)
1606 : end do
1607 : end do
1608 :
1609 : values(ipol,ichan,irow)=nvalue*conjg(
1610 12815514 : $ phasor(ichan, irow))
1611 : end if
1612 : end do
1613 : end if
1614 : end if
1615 : end do
1616 : end if
1617 : end do
1618 19581 : return
1619 : end
1620 : C
1621 :
1622 :
1623 : C Calculate gridded coordinates and the phasor needed for
1624 : C phase rotation.
1625 : C
1626 0 : subroutine smos (uvw, dphase, freq, c, scale, offset,
1627 : $ sampling, pos, loc, off, phasor)
1628 : implicit none
1629 : integer loc(2), off(2), sampling
1630 : double precision uvw(3), freq, c, scale(2), offset(2)
1631 : real pos(2)
1632 : double precision dphase, phase
1633 : complex phasor
1634 : integer idim
1635 : double precision pi
1636 : data pi/3.14159265358979323846/
1637 :
1638 0 : do idim=1,2
1639 : pos(idim)=scale(idim)*uvw(idim)*freq/c+
1640 0 : $ (offset(idim)+1)
1641 0 : loc(idim)=nint(pos(idim))
1642 0 : if(sampling.gt.1) then
1643 : C if((pos(idim)-loc(idim)) < 0.0)then
1644 : C loc(idim)=loc(idim)-1
1645 : C end if
1646 0 : off(idim)=nint((pos(idim)-real(loc(idim)))*real(-sampling))
1647 : C if(off(idim).eq.sampling) then
1648 : C off(idim)=0
1649 : C loc(idim)=loc(idim)+1
1650 : C end if
1651 : else
1652 0 : off(idim)=0
1653 : end if
1654 : end do
1655 0 : phase=-2.0D0*pi*dphase*freq/c
1656 0 : phasor=cmplx(cos(phase), sin(phase))
1657 0 : return
1658 : end
1659 :
1660 6456744 : logical function omos (nx, ny, loc, support)
1661 : implicit none
1662 : integer nx, ny, nw, loc(2), support
1663 : omos=(loc(1)-support.ge.1).and.(loc(1)+support.le.nx).and.
1664 6456744 : $ (loc(2)-support.ge.1).and.(loc(2)+support.le.ny)
1665 6456744 : return
1666 : end
1667 :
1668 :
1669 53414501 : logical function onmosgrid(loc, nx, ny, nx0, ny0,
1670 : $ nxsub, nysub, support, msuppx, msuppy,
1671 : $ psuppx, psuppy, centerin)
1672 : implicit none
1673 : integer, intent(in) :: nx, ny, nx0, ny0, nxsub, nysub, loc(2),
1674 : $ support
1675 : logical, intent(out) :: centerin
1676 :
1677 : integer, intent(out) :: msuppx, msuppy, psuppx, psuppy
1678 : integer :: loc1sub, loc1plus, loc2sub, loc2plus
1679 53414501 : msuppx=merge(-support, nx0-loc(1), loc(1)-support >= nx0)
1680 53414501 : msuppy=merge(-support, ny0-loc(2), loc(2)-support >= ny0)
1681 : psuppx=merge(support, nx0+nxsub-loc(1)-1 , (loc(1)+support)
1682 53414501 : $ < (nx0+nxsub))
1683 : psuppy=merge(support, ny0+nysub-loc(2)-1 , (loc(2)+support)
1684 53414501 : $ < (ny0+nysub))
1685 : C write(*,*) 'ny0,nysub,loc(2), msuppy',ny0,nysub,loc(2), msuppy,
1686 : C $ support, ((loc(2)+support) < (ny0+nysub))
1687 53414501 : loc1sub=loc(1)-support
1688 53414501 : loc1plus=loc(1)+support
1689 53414501 : loc2sub=loc(2)-support
1690 53414501 : loc2plus=loc(2)+support
1691 :
1692 : centerin=(loc(1).ge.nx0) .and. (loc(1).lt. (nx0+nxsub)).and.
1693 53414501 : $ (loc(2).ge.ny0).and.(loc(2) .lt. (ny0+nysub))
1694 : onmosgrid=(loc1plus .ge. nx0) .and. (loc1sub
1695 : $ .le. (nx0+nxsub)) .and.(loc2plus .ge. ny0) .and.
1696 53414501 : $ (loc2sub .le. (ny0+nysub))
1697 :
1698 53414501 : return
1699 : end
|