; PRO RH_GRILLE   (voir arguments plus bas)

; Rappels : l'image inteferometrique est calculee sur une grille de npi*npi
;   points sur le champ interfrometrique. Depuis le 6 jul 01 npi est fige a 128
;   dans RH_DPATCHFITS_NRH, independant du nbre de points np choisi par l'uti-
;   lisateur pour definir l'image heliographique sur un champ "larg".

; But : au lieu de calculer l'image pour un jeu (npi, npi) de coordonnees
;   interferometriques (r, s) entieres, qui echantillonnent le soleil sur une
;   grille en parallelogrammes avec origine (legerement) decalee et dont la
;   maille change avec le temps, on calcule des jeux de np*np valeurs non en-
;   tieres rg(n,n) et sg(n,n) qui definissent une grille carree de largeur 
;   "larg" et centree au centre du disque, dans laquelle le soleil apparait
;   rond. Le calcul d'image est fait en aval.


;   Au 16 nov 00 il reste un projet (en commentaires) pour mettre "champ" a 
;     zero a des distances hgeliocentriques superieures a rmax, ou rmax est
;     deduit de "larg" en fonction de la frequence. L'interet de ceci ne sem-
;     ble pas evident. Reflechir avant de virer ce cadavre. 

; Cadavre :
;     distances heliographiques au centre du soleil sont < une valeur qui
;	pourra etre choisie par l'utilisateur, et que, dans un premier temps, 
;	on definit dans RH_GRILLE comme une fonction simple de la frequence.

; Modifications
; 99 aug 24	"champ" en sortie : drapeau (n*n) qui vaut 1 pour les couples 
;		  (rg, sg) interieurs a [0, n], c'est a dire au champ interfe-
;		  rometrique tenant compte des harmoniques de E0. Ces derniers
;		  existant seulement sur l'axe u, ils ne "desaliasent" que fai-
;		  blement l'image. On conserve donc une visualisation de l'ali-
;		  asing partiel en EW.
; 00 dec 14	n_period en entree (nbre de champs interferometriques (>1 pour
;		  des images de CMEs)).
;		  n_period intervient dans la calcul de rg et sg, puisque :
;		  . l'origine (coin inf gauche) de l'image interferometrique
;		      etendue   
;		  "champ" est mis a zero a l'exterieur de du champ interfero-
;		  metrique ainsi etendu. Honnetement ca ne sert a rien car ca 
;		  fait double emploi avec miss=0 dans RH_CALC_IMAGE_HELIO.
; 01 jul  9	on passe en argument npi (nbre de pts sur l'image interfrome-
;		  trique) et np (nbre de pts sur l'image heliographique). npi
;		  est requis du fait de la periodisation de l'image.


; Notations:
;  entree
;    npi	dimension de l'image interferometrique definie sur un champ 
;		  interferometrique (compte non tenu de la periodisation, voir
;		  plus bas).
;    np 	dimension de l'image heliographique finale (np*np points). 
;		   Choisi dans RH_DPNEW.
;    larg	largeur totale (Rs) du champ couvert par la grille heliographi-
;		  que a mailles carrees (dans laquelle le soleil est rond). A 
;		  ne pas confondre avec la largeur du champ interferometrique.
;    maille	[x0, y0, x1, y1, x2, y2], coord helio des points definissant
;		 la maille elementaire des coord interferometriques: 
;			M0 (0,0), M1 (1,0) et M2 (0,1/2). Au sujet de (0, 1/2)
;		 voir commentaires dans maille_3.
;    freq	frequence (MHz).
;
;  interne:
;    u et v	vecteurs de base de la maille
;    xc,  yc	coord helio du centre des coord interferometriques.
;    TI, TJ	tableaux des indices courants (entiers) i et j des points de 
;		 l'image interpolee dans la grille finale ou le soleil est rond
;
;  sortie
;    rg, sg	coord interferometriques non entieres correspondant aux points
;		  de l'image sur la grille.
;    champ	drapeau mettant l'image helio a zero pour les couples (rg, sg)
;		  correspondant aux points exterieurs a l'image interferome-
;		  trique periodisee.

; On appelle :
;	- i et j les indices entiers dans la grille finale. Leur origine est 
;	    au centre du disque et varient de -np/2 a np/2-1. Ils sont appeles
;	    TI et TJ dans le calcul; IDL plus bas.
;	- L la largeur du champ interferometrique (RS).
;	- rg et sg les indices interferometriques non entiers (a determiner).
;	    Dans la mise en equation ci-dessous leur origine est prise au 
;	    centre du disque (au derives diurnes pres...) et ils varient de
;	    -npi/2 a npi/2-1 .
;	Le systeme a resoudre est:
; 		L/np * i = xc  +  rg(i,j) * ux   +   sg(i,j) * vx
; 		L/np * j = yc  +  rg(i,j) * uy   +   sg(i,j) * vy
;	Rem : npi intervient dans ux, uy, vx, vy, qui lui sont inversement 
;	      proportionnels.

;------------------------------------------------------------------------------
; Appel dans RH_DPATCHFITS_NRH.PRO
;    RH_GRILLE,  npi,  np,  maille,  n_period,  larg,   freq, $	; entree. 
;		 rg,   sg,  champ				; sortie.

PRO RH_GRILLE,  npi,  np,   maille,   n_period,   larg1,   freq, $ ; entree.
	     rg,   sg,  champ					   ; sortie.

	; "maille" (calculee par RH_MAILLE_3) est l'ensemble des coord helio de
	;    M0, M1, M2, definissant la maille interferometrique elementaire 
	;    MI. Un pavage de npi*npi MI recouvre le champ interferometrique 
	;    en EW et NS.

    larg = float (larg1)	; pour eviter une division entiere.

    common MALAX, ij, im, ian, icorpoi, icorion, isour, $
	etmer, edec, dew, new, hew, u, dns, hns, a1, nns, sinl, cosl, $
	sinp, cosp, gdel, ghmer, ahmer, c, rsol, ahmersol, sind, cosd
	; Rem : On utilise ce common seulement pour avoir des variables sous 
	;       la main pour des mises au point.
	; Rappel : new et nns sont les nbre de canaux "minima" en EW et NS.

; Controle pour constater les corrections d'angle p et de derive en ang horaire
	; et declinaison
    icon = 0
    if (icon eq 1) then begin
	print, 'RH_GRILLE :'
	help, sinp, cosp, gdel, ghmer
	stop
    endif

    rg    = fltarr (np, np)
    sg    = fltarr (np, np)
    champ = intarr (np, np) + 1


; Definition des indices courants des pts sur l'image helio (de -np/2 a np/2-1)
	; Rem : on raisonne ici sur une image encore non periodisee, donc
	;	  n_period n'intervient pas ici.
    TI = indgen(np) - np/2
    TJ = indgen(np) - np/2

; Calcul de vecteurs de base (en RS) de la maille et du centre des coordonnees
	; interferometriques en coord heliographiques.
    ux = maille(2) - maille(0)	; "maille" est fournie par RH_MAILLE_3 en Rs.
    uy = maille(3) - maille(1)
    vx = maille(4) - maille(0)
    vy = maille(5) - maille(1)
    xc = maille(0)
    yc = maille(1)

; Mise au point
    imp = 0
    if (imp eq 1) then begin
	print, 'RH_GRILLE :'
	print, '    np =', np, '     new =', new, '     nns =', nns
	print, '    Vecteurs de base de la maille (en Rs):'
	ch_format = "('    ux =', f5.2, '    uy =', f5.2, '    ', " + $
		    " '    vx =', f5.2, '    vy =', f5.2)"
	print, format=ch_format, ux, uy, vx, vy
	stop 
    endif
    ; Conclusion: ux ne depend pas de ie0_ns et ie2_ns (le champ EW est deter-
    ;  min'e par la presence des harm de E0 sur l'axe).
; Fin de mise au point.

; Resolution du systeme donnant rg et sg (en commentaires plus haut)
    det = ux * vy  - uy * vx
    for i = 0, np-1  do begin
	for j = 0, np-1  do begin
	  rg(i, j) = (larg/np * TI(i) - xc) * vy  - (larg/np * TJ(j) - yc) * vx
	  sg(i, j) = (larg/np * TJ(j) - yc) * ux  - (larg/np * TI(i) - xc) * uy
	endfor
    endfor

    rg = rg / det	; abscisses interfero fract., origine centre du champ 
    sg = sg / det 
	; Verification du 7 mai 98: au voisinage de midi rg(*, 64) et sg(64, *)
	;  (qui sont sur les axes de l'image heliographique) sont bien crois-
	;  sants comme attendu. 

; Mise de l'origine de rg et sg au coin inferieur gauche de l'image interfero-
	; metrique periodisee
	; Rappel : rg et sg precedemment calcules ont leur origine au centre
	;	    du disque. 
	; Rem    : c'est npi qui intervient, puisque rg et sg sont des coord
	;	    interferometriques fractionnaires.
    rg = rg + (npi * n_period) / 2
    sg = sg + (npi * n_period) / 2
	; Rem : l'ajout n'est jamais 1/2 entier, meme avec n_period = 3/2, car 
	;	  npi est un multiple eleve de 2.

; Visualisation de rg et sg
    imp = 0
    if (imp eq 1) then begin
;	shade_surf, rg
;	window, 1	&	wset, 1
;	shade_surf, sg
	print, 'min max(rg),  min max(sg):', $
		min(rg), max(rg), min(sg), max(sg)
	stop 
    endif
; Fin de mise au point

; Exclusion des points exterieurs au champ interferometrique periodise
    h_c = where( (rg lt 0) or (rg ge npi*n_period) )		; "hors champ".
	; Rem : c'est npi qui intervient car rg et sg sont des coord sur l'ima-
	;	ge imterferometrique.
    if (n_elements(h_c) gt 1)  then  champ(h_c) = 0
    h_c = where( (sg lt 0) or (sg ge npi*n_period) )
    if (n_elements(h_c) gt 1)  then  champ(h_c) = 0

; Controle
    icon = 0
    if (icon eq 1) then begin
	print, 'dimension du champ helio :', np
	print, 'nbre de pts du champ helio :', np*np
	print, 'nbre de pts interdits en rg:', $
		n_elements( where( (rg lt 0) or (rg ge np) ) )
	print, 'nbre de pts interdits en sg:', $
		n_elements( where( (sg lt 0) or (sg ge np) ) )
	print, 'nbre total de pts interdits:', $
		n_elements( where(champ eq 0) )
	window, 0
	tvscl, congrid(champ, 512, 512, cubic=-0.5)
	xyouts, 0.5, 0.97, /normal, alignment=0.5, $
		'"champ" (limite le calcul d image helio au champ interfero-'
	xyouts, 0.5, 0.93, /normal, alignment=0.5, $
		'metrique periodise)'
	window, 1
	shade_surf, champ
	xyouts, 0.5, 0.97, /normal, alignment=0.5, $
		'"champ" (limite le calcul d image helio au champ interfero-'
	xyouts, 0.5, 0.93, /normal, alignment=0.5, $
		'metrique periodise)'
	stop
	; Conclusion : pour "larg" grand et l'image peu ou pas periodisee on 
	;    verifie qaue le domaine ou champ vaut 1 est un parallellogramme.
    endif		; fin de controle

; DELOUISERIE NON UTILISEE ET MISE EN COMMENTAIRE LE 14 DEC 00
;; Exclusion des points situes a une distance heliocentrique > rmax.
;	; D'apres le systeme d'equations a resoudre (en commentaires) les coord
;	;  helio  du point correspondant a rg(i, j) et sg(i,j) sont:
;	;	Xrs = larg * TI		et		Yrs = larg * TJ
;	; On annule "champ" pour 	Xrs^2 + Yrs^2 > rmax^2
;    rmax = 3.4 * 164 / freq		; formule bidon de J-M. (rmax en RS).
;;   rmax = 5.0 * 164 / freq		; avec champ=-1, permets de discerner
;					;   de la limitation au champ inter-
;					;   fero a 327 MHz.
;    r2 = fltarr(np,np)			; carres des distances heliocentriques.
;    for i = 0, np-1  do begin
;	for j = 0, np-1  do begin
;	  r2(i, j) = (larg/np)^2  *  (TI(i)^2 + TJ(j)^2)
;	endfor
;    endfor
;    h_c = where(r2 gt rmax^2)		; "hors champ".
;;   if (n_elements(h_c) gt 1)  then  champ(h_c) = 0	; -1 pour essais, pour
;	; differencier de la limitation aux champs interferometriques.

; Mise au point
    icon = 0
    if (icon  eq  1) then begin
	window, 0
	wset, 0
	shade_surf, champ
	stop
    endif

    end			; fin de RH_GRILLE.
