⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zern_save.pro

📁 IDL语言编写的用于天文自适应光学仿真的软件CAOS V6.0的第一部分。
💻 PRO
字号:
; $Id: zern_save.pro,v 1.1.1.1 2002/03/12 11:53:46 riccardi Exp $
;
; A. Riccardi, Dipartimento di Astronomia di Firenze (Italy).
; e-mail address: riccardi@arcetri.astro.it
; Please, send me a message if you modify this code.


function ref_symm, j_even, m_even, m
	refs = [1, 1]

	if (m eq 0) then return, refs
	
	if (j_even xor m_even) then refs(0)=-1
	if (not j_even) then refs(1)=-1

	return, refs
end


function cen_symm, m_even
	if (m_even) then return, 1 else return, -1
end



pro zern_save, sampling, jmax, filename, JMIN=jmin, RATIO=ratio, $
	COMP_DOUBLE=comp_double, SAVE_DOUBLE=save_double, PUPIL=pupil, INFOS=infos, $
	VERBOSE=verbose
;+
;   ZERN_SAVE, Sampling, Jmax, Filename
;
;	KEYWORDS:
;		JMIN:	integer scalar. Minimum value of polynomial index.
;               JMIN=1 if undefined.
;		RATIO:	real scalar. If undefined is set to 1.
;		COMP_DOUBLE:	set it to compute data as double (float default).
;		SAVE_DOUBLE:	set it to save data as double (float default).
;		INFOS:	array of info structures (see ZERN_INFOS). If is defined
;				info structures are used (faster). Be carefull that infos
;				data have the same type as specified by COMP_FLOAT.
;		PUPIL:	array, same dim's as R. Pupil to store. If undefined
;				R<=1. is used.
;		VERBOSE:if set uses verbose style
;
; save an array of Zernike polynomial images into a file
; First image is always the pupil.
;
; The file have the following structure:
;
; HEADER: 2+8+2+2+2 = 16 byte
;	{ zern_header,
;		sampling:	integer; dim of polynomial array (only a quarter saved)
;		ratio:		double;  x max (y max) sampled (see MAKE_XY)
;		jmin:		integer; min value of polynomial index
;		jmax:		integer; max value of polynomial index
;		is_double:	integer; true if polymial are saved as double typed
;	}
;
; DATA: structured as:
;	{ zern_data,
;		j:			integer; polynomial index
;		n:			integer; radial degree
;		m:			integer; azimuthal frequency
;		ref_symm:	2 elements integer vector (values: +/-1); reflection
;					symm's, ref_symm(0): x(y?) reflection, ref_symm(1): y ref.
;		cen_symm:	integer (value: +/-1); center symmetry
;		poly:		sampling/2 x sampling/2 array, if SAVE_DOUBLE is true
;					then array is double type, else is float type.
;	}
;
;-
	if (n_elements(jmin) eq 0) then $
		jmin = 1

	if (n_elements(ratio) eq 0) then $
		ratio = 1.

	make_xy, sampling, ratio, r, theta, /polar, double=comp_double, /quarter
	
	header = $
	{ zern_header, $
		sampling	: fix(sampling), $
		ratio		: double(ratio), $
		jmin		: fix(jmin), $
		jmax		: fix(jmax), $
		is_double	: fix(keyword_set(save_double)) $
	}

	header_len = n_tags(header,/LEN)
	
	;;;openw, unit, filename, /get_lun
	openw, unit, filename, /get_lun
	zern = assoc(unit, header)
	zern(0)=header
	close, unit

	if (keyword_set(save_double)) then $
		data = $
		{ zern_data, $
			j			: 0, $
			n			: 0, $
			m			: 0, $
			ref_symm	: [1, 1], $
			cen_symm	: 1, $
			poly		: double(r) $
		} $
	else $
		data = $
		{ zern_data, $
			j			: 0, $
			n			: 0, $
			m			: 0, $
			ref_symm	: [1, 1], $
			cen_symm	: 1, $
			poly		: float(r) $
		}
		
	openu, unit, filename, /get_lun
	zern = assoc(unit, {zern_data}, header_len)


	if (n_elements(pupil) eq 0) then $
		data.poly = (r le 1.) $
	else $
		data.poly = pupil

	zern(0)=data
		
	is_verbose = keyword_set(verbose)

	if (n_elements(infos) eq 0) then begin
		jz=1
		for j=jmin,jmax do begin
			if (is_verbose) then begin 
				print, j
				flush,-1
			endif
			zern_degree, j, n, m
			j_even = is_even(j)
			m_even = is_even(m)
			data.j = j
			data.n = n
			data.m = m
			data.ref_symm = ref_symm(j_even, m_even, m)
			data.cen_symm = cen_symm(m_even)
			data.poly = zern_polar(j, r, theta)
			
			zern(jz) = data
			
			jz=jz+1
		endfor
	endif else begin
		n_infos=n_elements(infos)
		jz=1
		for i=0,n_infos-1 do begin
			j=infos(i).j
			if ((infos(i).j ge jmin) and (infos(i).j le jmax)) then begin
				if (is_verbose) then begin 
					print, j
					flush,-1
				endif
				data.j=infos(i).j
				data.n=infos(i).n
				data.m=infos(i).m
				j_even = is_even(infos(i).j)
				m_even = is_even(infos(i).m)
				data.ref_symm = ref_symm(j_even, m_even, infos(i).m)
				data.cen_symm = cen_symm(m_even)
				data.poly = zern_ipolar(infos(i), r, theta)
				
				zern(jz) = data
				
				jz=jz+1
			endif
		endfor
	endelse
	
	close, unit
	return
end




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -