Introduction¶
Description¶
(an acronym for HAnle and ZEeman Light) is a computer program for the synthesis and inversion of Stokes profiles caused by the joint action of atomic level polarization and the Hanle and Zeeman effects. It is based on the quantum theory of spectral line polarization, which takes into account rigorously all the relevant physical mechanisms and ingredients: optical pumping, atomic level polarization, level crossings and repulsions, Zeeman, Paschen-Back and Hanle effects. The code is written in standard Fortran 90. Its parameters are passed using four configuration files that can be manually edited.  In any case, two front-ends coded in IDL are given as a part of the distribution in order to facilitate a user-friendly execution of the program. A parallel version of the code using Message Passing Interface (MPI) is also available. This manual considers both distributions.
Credits¶
The code has grown since the first version thanks to the suggestions of many people. We thank Rebecca Centeno Elliot, Yukio Katsukawa, Marian Martínez González, Rafael Manso Sainz and Tom Schad for their help on testing the code and proposing (and partially coding, in some cases) some of the options of the code.
Uncompressing and compiling¶
Serial version¶
The package comes in a single compressed file hazel.tar.gz
. After
unpacking with tar zxvf hazel.tar.gz
, the directory will contain
the following subdirectories:
- Source contains the Fortran 90 sources and a makefile that can be used to build the binary file.
- Run contains a directory tree structure with the appropriate configuration files to run the code in command line mode.
- Widget_Synth contains all the files that are needed to run the IDL front-end for the synthesis problem.
- Widget_Inv contains all the files that are needed to run the IDL front-end for the inversion problem.
- IDL_routines contains some IDL routines that are needed by the front-ends.
- Manual contains this manual.
The code has been tested on Linux platforms using the Intel Fortran
Compiler (ifort
) and the free GFortran compiler. The source code is
in the Source/
directory. The compilation is performed with the
supplied makefile
. It is quite simple and easy to modify, and
contains additional comments about compiling. The default compiler is
the ifort
, although you can use any other compiler through the
variable COMPILER
. In order to obtain the executable file, just
type:
make all
After compiling and linking, the executable is copied to the Run/
,
Widget_Synth/
and Widget_Inv/
directories. Running the program
in the Run/
directory should produce the correct output depending on
the exact form of the input files.
The generated object and module files can be cleaned typing:
make clean
Parallel version¶
The package also decompresses the directory tree that will contain the following subdirectories:
- SourceMPI contains the Fortran 90 sources and a makefile that can be used to build the binary file.
- RunMPI contains a directory tree structure with the appropriate configuration files to run the code in command line mode.
The source code is in the SourceMPI/
directory. The compilation
depends on the precompiled library NetCDF [2] for reading and writing
output files. NetCDF is a standard for platform independent binary files
that you need to have installed in your system. The compilation is
performed with the supplied makefile
. It is quite simple and easy to
modify, and contains additional comments about compiling. The default
compiler is mpif90
, although you can use any other compiler through
the variable COMPILER
. The variables NETCDF_INCLUDE
and
NETCDF_LIB
have to point to the include
and lib
directories
of the NetCDF distribution.
The code makes use of the MPI package for parallelization, so it has to be installed on your system. In order to obtain the executable file (for instance for the Intel compiler), just type:
make -f makefile.Intel
Modify the makefile
to point the variables to the correct libraries
and include files. After compiling and linking, the executable is copied
to the RunMPI/
directory, where the code is run. Running the
program in the RunMPI/
directory should produce the correct output
depending on the exact form of the input files.
The generated object and module files can be cleaned typing:
make clean
The code is run from the RunMPI
directory. Use your MPI launcher to
select the number of processors. For example:
mpiexec -n 50 hazel_mpi config_inversion.dat 2000 5000
The code admits up to three command line parameters:
- Filename with the main configuration file.
- Starting pixel of the inversion. This is used if you want to rerun the inversion of some pixels.
- Final pixel of the inversion. This is used if you want to rerun the inversion of some pixels.
See §[sec:phazel_files] for details on the input files.
New input file¶
In previous versions of the code, the code was controlled with four
configuration files. The updated version of the code is now controlled
by one human-readable configuration file. The code can still be run
using the old configuration files but this option will be discontinued
in the future so it is advisable to to the shift to this configuration
file. In order to use this option, you need to have the configparser
package installed in your system. It can be downloaded from
http://www.voidspace.org.uk/python/configobj.html
. The serial code
is now run using:
./run.py conf.ini
and the parallel code is run with
./run.py conf.ini nProcessors
An example of the file, that is self-explanatory, is:
# Hazel configuration File
#####################
# General information
#####################
[Files]
Input model file = 'ATOMS/helium.mod'
File with observations = 'OBSERVATION/test_2comp.prof'
File with inverted profiles = 'test.inversion'
File with inverted parameters = 'test.parameters'
[Working mode]
Action = 'inversion' # 'synthesis' or 'inversion'
Verbose = no
Linear system solver = 'LU' # 'LU' or 'CG'
Stopping volume for DIRECT = 0.001
[General parameters]
Synthesis mode = 'exact' # 'thin' or 'exact'
Include stimulated emission = yes
Include magnetic field = yes
Include Paschen-Back effect = yes
Include atomic level polarization = yes
Include magneto-optical effects in the RT = yes
Include stimulated emission in the RT = yes
Multiplet = 10830 # 10830, 5876, 7065, 3889 A
Line-of-sight angles = 0.0, 0.0, 90.0 # theta, chi, gamma deg
Wavelength axis = -3.0, 2.5, 200 # Minimum, maximum and number of grid points
#####################
# Synthesis parameters
#####################
[Synthesis]
Number of slabs = '1' # '1' -> single slab, '1+1' -> two slabs with same field, '1+1B' -> 2 slabs with different field, '2' -> two slabs added with a filling factor
Boundary condition = 4.098e-5, 0.0, 0.0, 0.0 # I0, Q0, U0, V0
a = 0.0
height = 3.0 # Real height if positive, apparent height if negative arcsec
ff = 0.0
[[Slab 1]]
B = 0.0 # G
thetaB = 0.0 # deg
chiB = 0.0 # deg
vdopp = 8.0 # km/s
tau = 1.0
vmac = 0.0 # Positive is redshift km/s
beta = 1.0
[[Slab 2]]
B = 0.0 # G
thetaB = 0.0 # deg
chiB = 0.0 # deg
vdopp = 0.0 # km/s
tau = 0.0
vmac = 0.0 # Positive is redshift km/s
beta = 1.0
#####################
# Ranges for the DIRECT method [min, max]
#####################
[Ranges]
a = 0,0.5
ff = 0.0,1.0
[[Slab 1]]
B = 800,1100
thetaB = 0,180
chiB = 0,180
vdopp = 2,12
tau = 0.1,2
vmac = -5,5
beta = 0.5,2
[[Slab 2]]
B = 800,1100
thetaB = 0,180
chiB = 0,180
vdopp = 2,12
tau = 0.1,2
vmac = -5,5
beta = 0.5,2
#####################
# Parameters to invert
#####################
[Inversion]
Iterations in LM = 20
Number of cycles = 4
Inversion modes = 'DIRECT', 'LM', 'DIRECT', 'LM' # 'DIRECT' for DIRECT algorithm and 'LM' for Levenberg-Marquardt
[[Cycles]]
a = 1, 1, 0, 0
ff = 0, 0, 0, 0
[[[Slab 1]]]
B = 0, 0, 1, 1
thetaB = 0, 0, 1, 1
chiB = 0, 0, 1, 1
vdopp = 1, 1, 0, 0
tau = 1, 1, 0, 0
vmac = 1, 1, 0, 0
beta = 0, 0, 0, 0
[[[Slab 2]]]
B = 0, 0, 0, 0
thetaB = 0, 0, 0, 0
chiB = 0, 0, 0, 0
vdopp = 0, 0, 0, 0
tau = 0, 0, 0, 0
vmac = 0, 0, 0, 0
beta = 0, 0, 0, 0
[[Weights]]
Stokes I = 1.0, 1.0, 1.0, 1.0
Stokes Q = 0.0, 0.0, 1.0, 1.0
Stokes U = 0.0, 0.0, 1.0, 1.0
Stokes V = 0.0, 0.0, 1.0, 1.0
Input files¶
is controlled via four configuration files. All configuration files are fully commented, so that changing any parameter should be an easy task. In the following, we describe them step by step.
config_inversion.dat
¶
This file can be considered as the main configuration file and it is the only one that has to have a fixed name. This file is used to indicate the names of the input files, the names of the output files, verbosity level and to decide whether is to be applied to work in synthesis or inversion mode. Using the example included in the present version of , we analyze one by one all the inputs.
# Input model file
'ATOMS/helium.mod'
Definition of the file with the atomic model. See §[sec:atomic_model] for an explanation of the file format.
# Initial parameters file
'init_parameters.dat'
Definition of the file with the initial parameters of the problem. The values of the parameters in this file are taken as initial values for the inversion or for the synthesis. See §[sec:init_parameters] for a detailed description of the file.
# Range of parameters for the DIRECT method
'direct_range.dat'
This file is used to define the lower and upper limits of the intervals inside which the DIRECT method searches for the minimum of the \(\chi^2\) function. See §[sec:direct_range] for details.
# Output for the upper level rho^K_Q(J,J') in the vertical reference frame
'ATOMIC_POL/vertical_upper.rho'
# Output for the lower level rho^K_Q(J,J') in the vertical reference frame
'ATOMIC_POL/vertical_lower.rho'
# Output for the upper level rho^K_Q(J,J') in the mag. field reference frame
'ATOMIC_POL/magnetic_upper.rho'
# Output for the lower level rho^K_Q(J,J') in the mag. field reference frame
'ATOMIC_POL/magnetic_lower.rho'
The previous lines define the output files where the spherical tensor components of the density matrix are saved. Note that the code stores only the density matrix elements of the upper and lower level of the desired transition. The elements of the atomic density matrix depend on the chosen reference system, and the two most desired reference systems are the one in which the quantization axis is chosen along the solar local vertical direction and the one in which the quantization axis is chosen along the magnetic field vector.
# Output absorption/emission coefficients
'INVERTED/rtcoef.emer'
# Output absorption/emission coefficients neglecting atomic polarization
'INVERTED/rtcoef_noatompol.emer'
The emission coefficients \(\epsilon_{I,Q,U,V}\), the absorption coefficients \(\eta_{I,Q,U,V}\) and the anomalous dispersion coefficients \(\rho_{Q,U,V}\) for each wavelength point are saved in these files. The first file includes the effects of atomic level polarization, while the second one neglects its influence.
# File with the observed profiles
'OBSERVATION/test.prof'
When using the code in the inversion mode, this file is the one used for the input of the observed Stokes profiles. The format of this file depends on which version of the code is used. For , it is very simple. The first line indicates the number of wavelength points and the normalization (use ’cont’ or ’peak’). Then, a table with nine columns gives the value of the wavelength shift with respect to the center of the multiplet, the Stokes vector at each wavelength normalized to the maximum intensity, and an estimation of the noise standard deviation at each wavelength normalized to the maximum intensity. See the example file contained in the distribution for more details. Note that these lines have to be present in the input file even if is used in synthesis mode.
When using , the input file is more complicated and is described in §[sec:phazel_files].
# File with the inverted profiles
'test.inversion'
# File with the parameters from the inversion
'test.parameters'
The final Stokes profiles resulting from the synthesis or inversion options is saved in the file indicated in the first line. The format is the same as that explained for the file containing the observation. When is run in inversion mode, the final inferred parameters of the model are saved in the file indicated in the second line. Again, for the output files are described in §[sec:phazel_files].
# File that sets the parameters to invert
'invert_parameters.dat'
This file defines which parameters to invert in the inversion mode, together with the algorithm to be used in each cycle and the weight used for each Stokes parameter.
# Verbose mode (0-> no, 1-> yes)
0
Flag to connect or disconnect the verbose mode. For the inversion of Stokes profiles affected by atomic level polarization it is sometimes useful to turn the verbose mode on for analyzing the process of the code while calculating.
# Linear system solver (0-> LU, 1-> CG)
0
This flag is used to choose the algorithm that solves the linear system of statistical equilibrium equations. For relatively simple models, the LU decomposition does a very good job in terms of speed. If the number of unknowns (i.e., of \(\rho^K_Q(J,J')\) elements) turns out to be of the order of or larger than \(10^3\), conjugate gradients (CG) methods are a much better option. We recommend to use the LU decomposition when possible and move to the CG solution only when necessary. The CG solution are based on routines developed by Dr. Mark K. Seager from Lawrence Livermore National Lab.
# Optically thin (0), slab no-MO (1), M-E (2), slab DELOPAR (3),
simplified slab (4), exact slab (5)
5
This flag is used to choose the level of approximation for the solution of the radiative transfer equation. The meaning of each option is explained below in §[sec:radiative_transfer].
# Synthesis mode -> 0 , Inversion mode -> 1
0
This flag controls the working mode of the code (synthesis or inversion).
init_parameters.dat
¶
This important file establishes the parameters of the model, together with the definition of the scattering geometry. It includes also flags to turn on or discard different physical mechanisms. In the synthesis mode, the values in this file are used to carry out the synthesis. In the inversion mode, the values in this file are chosen as initial conditions for the inversion for those parameters that are left free. For those that are left fixed, the code uses the values defined in this file. We explain them step by step.
# Include stimulated emission (0-> no, 1-> yes)
1
This flag is used to take into account or discard the effect of stimulated emission in the emergent Stokes profiles. Although stimulated emission is negligible for most solar it can be of importance for very strong radiation fields. We recommend to use always 1 since the computational time is barely affected by this flag.
# Include magnetic field (0-> no, 1-> yes)
1
This flag is used to slightly reduce the computational work for the non-magnetic case because, if set to zero, the magnetic kernel [see Eq. ([eq:see])] is not calculated.
# Include depolarization rates (0-> no, 1-> yes)
0
# Value of delta if depol. rates are included (not used if prev. value = 0)
1.d14
In the present version of it is possible to include the effect of depolarizing collisions only in the ground level of the atomic system. In case the effect of collisions is to be accounted for, set the first parameter to 1 and give the collisional rate in the next parameter in units of s\(^{-1}\).
# Include Paschen-Back effect (0-> no, 1-> yes)
1
The effect of a magnetic field on the energy levels of the atomic system can be calculated under the approximation of the linear Zeeman effect or in the general case of the intermediate Paschen-Back effect. If this flag is set to 0, the approximation of the linear Zeeman effect is used and no perturbations between different \(J\) levels of a term are taken into account. If the flag is set to 1, the general theory of the Paschen-Back effect is used to calculate the wavelength positions and the strengths of the \(\pi\) and \(\sigma\) components. The difference in the computational work between both approaches is rather small.
# Number of slabs (1-> 1 slab, 2-> 2 slabs with same B,
3-> 2 slabs with different B, -2 -> 2 slabs with filling factor)
can be used using one slab (option 1) of constant physical properties or two (options 2 and 3 and -2). The difference between options 2 and 3 is that option 2 considers both slabs to have exactly the same field while option 3 considers two different fields. As a consequence, the computing time is smaller in option 2. In both options, the second slab is placed in front of the first one, so that the boundary condition of the second slab is the emergent radiation from the first. In option -2, the radiation emerging from both slabs is added weighted with a filling factor, which is indicated below.
# Magnetic field strength [G], thetaB [degrees], chiB [degrees]
0.3d0 90.d0 90.d0
The magnetic field vector is defined here. The strength in G and the inclination and azimuth angles in degrees define the magnetic field vector. The angles are defined with respect to the vertical direction in the atmosphere, as shown in Fig. [fig:geometry]. Note that, if the azimuth of the field is set to 999, the random azimuth solution is obtained following the strategy explained in Appendix C of :raw-latex:`\cite{belluzzi07}`. If two slabs are used (setting option 3 or -2 above), put the two field vectors next to each one in the format \((B,\theta_B,\chi_B)_1 (B,\theta_B,\chi_B)_2\).
# Apparent height (if <0) or real height (if >0) of the atoms in arcsec
3.d0
The tensors \(J^0_0\) and \(J^2_0\) that quantify the mean intensity of the radiation field and its anisotropy are calculated assuming a standard solar center-to-limb variation (CLV) and taking into account geometrical effects. This parameter gives the height at which the slab of atoms is placed with respect to the surface of the Sun.
# Optical depth of the slab in the maximum of I (slab) or strength of the line (ME)
1.0d0
This quantity is the optical depth of the slab at the wavelength position of the maximum absorption or emission in Stokes \(I\). For example, for the 10830 Å multiplet of He i, this is the position of the red blended component. If two slabs with option 2 or 3 are used, put the two optical depths together. If option -2 is used, then add the filling factor as a third number.
# Source function increase
1.d0
The source function of the slab will be multiplied by this number. This is a way to generate lines in emission even when the slab is seen on the solar disk. If two components (one after the other) are used, this number only modifies the source function of the second component. This allows us to simulate self-absorption in the code.
# Boundary Stokes parameters (I0,Q0,U0,V0)
4.098d-5 0.d0 0.d0 0.d0
Boundary conditions for the Stokes vector used in the solution of the
radiative transfer equation. If the radiation field is the photospheric
continuum, the IDL routine IDL_routines/solar_field.pro
can be used
to return an estimation.
# Transition where to compute the emergent Stokes profiles
1
From the transitions defined in the atomic model, the code calculates the emergent Stokes profiles for the chosen transition. For the moment, only one transition at a time is allowed. We plan to extend this to synthesize several lines.
# Include atomic level polarization? (0-> no, 1-> yes)
1
The synthesis or inversion options can be used taking into account or neglecting the presence of atomic level polarization. This flag controls it.
# Observation angle with respect to the local solar vertical theta,chi,gamma [degrees]
0.d0 0.d0 90.d0
The line-of-sight direction is defined using the angles described in Fig. [fig:geometry]. All angles are given in degrees.
# Wavelength axis: minimum, maximum and number of grid points
-3.d0 2.5d0 200
In case the code is run in synthesis mode, this line is used to set the lower and upper limits (in cm\(^{-1}\)) of the wavelength axis. The last parameter gives the number of wavelength points to be used. In the inversion mode, the wavelength axis is chosen automatically from the observation and these numbers are overridden.
# Line wavelength [A], Doppler velocity [km/s] and damping [a]
10829.0911d0 6.5d0 0.d0
This line is used to define the wavelength of the multiplet (wavelength of the \((L,S) \to (L',S')\) transition), the Doppler width of the line in km s\(^{-1}\) and the reduced damping constant. If two slabs (through options 3 or -2) are used, add the Doppler width of the second component next to the first one. Concerning the reduced damping constant, if its value is negative, it is computed using the natural damping and using the Doppler broadening. The absolute value of the input value is used then as an enhancement factor (so you should use \(-1\) is you want to use the natural width).
# Macroscopic velocity [km/s] (>0 is a redshift)
0.d0
This defines the wavelength shift produced by the presence of a bulk motion of the plasma. Note that positive velocities imply redshifts. If two components (options 2, 3 or -2) are used, put the two bulk velocities.
# Include magneto-optical effects in the RT
1
It is possible to include (1) or neglect (0) the influence of the anomalous dispersion coefficients \(\rho_{Q,U,V}\) in the calculation of the emergent Stokes profiles.
# Include stimulated emission in the RT
1
This flag controls whether we include (1) or neglect (0) the influence of the stimulated emission in the calculation of the emergent Stokes profiles.
direct_range.dat
¶
The DIRECT global optimization method is used to give a first estimation of the parameters from which the Levenberg-Marquardt method is applied to locate the minimum of the \(\chi^2\) surface. The behavior of the DIRECT method is controlled with this file, in which we must specify the upper and lower limits of the model parameters, together with details about the stopping criterion. In the following, we describe all the options in detail.
# Output file
'direct.location'
The DIRECT method tries to evaluate the merit function \(\chi^2\) as few times as possible. The code saves in this file the values of the parameters at which the algorithm has carried out the evaluation of the merit function. This can be useful for analyzing the presence of ambiguities. In this case, the method will clearly mark the position of the possible solutions by evaluating the merit function more times in the surroundings of the compatible solutions. Note that this lines are absent on the configuration file.
# Maximum number of function evaluations (<0 -> don't use this criteria)
-1
# Reduction in the volume (<0 -> don't use this criteria, typically 0.01)
0.001
The previous two lines are used to indicate the stopping criterion for the DIRECT method. An early stop will probably give a first estimation of the solution that is far from the final result. Letting the code run for many iterations may degrade too much the computing time because of the poor local convergence properties of the DIRECT scheme. The first option permits the user to stop after a fixed number of evaluations of the merit function. The second option permits the user to stop when the ratio between the hypervolume where the global minimum is located and the original hypervolume is smaller than the given threshold. We have verified that 0.001 gives very good results. Setting one of the two parameters to values \(< 0\) will disconnect it.
# Magnetic field (0-Bmax)
800.d0 1100.d0
# thetab (0 .. 180)
30.d0 180.d0
# chib (0 .. 180)
-180.d0 0.d0
# vdopp (0 .. 20)
2.d0 7.d0
# dtau (0 .. 5)
0.d0 1.d0
# delta_collision (0 .. 18)
0.d0 18.d0
# vmacro (-10 .. 10)
-10.d0 10.d0
# damping (0 .. 4)
0.d0 4.d0
# beta (0 .. 10)
0.d0 1.d0
# height (0 .. 100)
0.d0 100.d0
# dtau2 (0 .. 5)
0.d0 2.d0
# vmacro2 (-10 .. 10)
25.d0 35.d0
# Magnetic field 2 (0-Bmax)
800.d0 1100.d0
# thetab 2 (0 .. 180)
30.d0 180.d0
# chib 2 (0 .. 180)
-180.d0 0.d0
# vdopp 2 (0 .. 20)
2.d0 12.d0
The previous lines define the space of parameters where the DIRECT method will look for the global minimum.
invert_parameters.dat
¶
This file is used to set the behavior of the inversion mode: the structure of the inversion cycle, setting the free and the fixed parameters.
# Maximum number of iterations
20
This parameter sets the maximum number of Levenberg-Marquardt (LM) iterations to be carried out in each cycle. Sometimes the LM scheme stops before reaching the maximum number of iterations because the relative change in the parameters from one iteration to the next is below 10\(^{-4}\).
# Number of cycles
2
The optimal iteration scheme is composed of combinations of cycles. In the first cycle, the DIRECT method is used to give a first estimation of the solution. In the second cycle, the LM method is used to refine the solution until arriving to the final one. This parameter sets the number of cycles used.
# Invert the magnetic field strength
1 1 1 1
# Invert the magnetic field inclination
1 1 1 1
# Invert the magnetic field azimuth
1 1 0 0
# Invert the Doppler width
0 0 0 0
# Invert the optical depth or strength of the line
0 0 0 0
# Invert the D^2 of the lower level
0 0 0 0
# Invert the macroscopic velocity
0 0 0 0
# Invert the damping
0 0 0 0
# Invert the source function gradient
0 0 0 0
# Invert the height of the He atoms
0 0 0 0
# Invert the optical depth or strength of the line of component 2
0 0 0 0
# Invert the macroscopic velocity of component 2
0 0 0 0
# Invert the magnetic field strength of component 2
0 0 1 1
# Invert the magnetic field inclination of component 2
0 0 1 1
# Invert the magnetic field azimuth of component 2
0 0 1 1
# Invert the Doppler width of component 2
0 0 0 0
Depending on the number of cycles, the previous lines define whether a
parameter is inverted (setting a 1 in the corresponding cycle) or kept
fixed to the value given in the init_parameters.dat
file (setting a
0 in the corresponding cycle). The number of 0s/1s in each line has to
be larger or equal to the number of cycles.
# Weights for Stokes I in each cycle
1.d0 1.d0 1.d0 1.d0
# Weights for Stokes Q in each cycle
1.d0 1.d0 1.d0 1.d0
# Weights for Stokes U in each cycle
1.d0 1.d0 1.d0 1.d0
# Weights for Stokes V in each cycle
1.d0 1.d0 1.d0 1.d0
Since the inversion is based on the gradient descent minimization of the \(\chi^2\) merit function and not on sampling methods, it is important to modify sometimes the weight of each Stokes vector in order to increase the sensitivity of the \(\chi^2\)-function to some model parameters. The code allows to change the relative weight of each Stokes vector in each cycle.
# Inversion modes (1-> LM, 2-> DIRECT, 3-> PIKAIA)
2 1 2 1
The optimization method used in each cycle is set in this line. Note that the scheme DIRECT+LM has been empirically proved to be quite optimal. The possibility to use genetic optimization based on the Pikaia algorithm is still in a preliminary phase. However, the large number of function evaluations that any genetic algorithm needs makes it difficult to beat the DIRECT+LM combination.
Ambiguities¶
You have to remember that the results of Hazel are potentially affected
by ambiguities and you have to take them into account. There is an
utility written in IDL that, given an inverted map, obtains all the
other solutions which are ambiguous in the saturation regime. This can
be called, including the appropriate paths and discarding the final
.nc
extension, by:
IDL> disamb, 'file_with_inversions', 'file_with_observations', angleObs
where angleObs
is the observation angle \(\theta\) (so that it
is 90\(^\circ\) for an observation exactly at the limb. This
program can be called with the additional /gen_files_inversion
,
which then generates a set of observations, configuration files and a
file to run . This is useful in case the line is not in the saturation
regime. In this case, the ambiguous solutions that are found by the code
are not strictly valid and one should refine them with a final LM cycle
in which \(B\), \(\theta_B\) and \(\chi_B\) are left free.
The solution to the ambiguities in the saturation regime is shown in
Section [sec:ambiguities].
Calling Hazel from Python¶
We have developed a wrapper to allow the user to call the synthesis
routines of Hazel in Python. To do so, just enter into the directory
SourcePy
and type
python setup.py build_ext --inplace
and a library pyhazel.so
will be generated (and also copied to the
directory RunPy
. In this very same directory you can see the
test.py
file that shows how to call the code to wrapper.
Basic Equations¶
We consider a constant-property slab of atoms, located at a height \(h\) above the visible solar “surface”, in the presence of a deterministic magnetic field of arbitrary strength \(B\), inclination \(\theta_B\) and azimuth \(\chi_B\) (see Fig. 1). The slab’s optical thickness at the wavelength and line of sight under consideration is \(\tau\). We assume that all the atoms inside this slab are illuminated from below by the photospheric solar continuum radiation field, whose center-to-limb variation has been tabulated by :raw-latex:`\cite{pierce00}`. The ensuing anisotropic radiation pumping produces population imbalances and quantum coherences between pairs of magnetic sublevels, even among those pertaining to the different \(J\)-levels of the adopted atomic model. This atomic level polarization and the Zeeman-induced wavelength shifts between the \(\pi\) (\(\Delta{M}=M_u-M_l=0\)), \(\sigma_{\rm blue}\) (\(\Delta{M}=+1\)) and \(\sigma_{\rm red}\) (\(\Delta{M}=-1\)) transitions produce polarization in the emergent spectral line radiation.
In order to facilitate the understanding of the code, in the following we summarize the basic equations which allow us to calculate the spectral line polarization taking rigorously into account the joint action of atomic level polarization and the Hanle and Zeeman effects. To this end, we have applied the quantum theory of spectral line polarization, which is described in great detail in the monograph by :raw-latex:`\cite{landi_landolfi04}`. We have also applied several methods of solution of the Stokes-vector transfer equation, some of which can be considered as particular cases of the two general methods explained in §6 of :raw-latex:`\cite{trujillo03}`.
The radiative transfer approach¶
The emergent Stokes vector \(\mathbf{I}(\nu,\mathbf{\Omega})=(I,Q,U,V)^{\dag}\) (with \(\dag\)=transpose, \(\nu\) the frequency and \(\mathbf{\Omega}\) the unit vector indicating the direction of propagation of the ray) is obtained by solving the radiative transfer equation
where \(s\) is the geometrical distance along the ray under consideration, \(\bm{\epsilon}(\nu,\mathbf{\Omega})=({\epsilon}_I,{\epsilon}_Q,{\epsilon }_U,{\epsilon}_V)^{\dag}\) is the emission vector and
distance along the ray, \({\rm d}{\tau}=-{\eta_I}{\rm d}s\), one can write the Stokes-vector transfer Eq. ([eq:rad_transfer]) in the following two ways:
The first one, whose formal solution requires the use of the evolution operator introduced by :raw-latex:`\cite{landi_landi85}`, is
\[ \begin{align}\begin{aligned} {{d}\over{d{\tau}}}{\bf I}\,=\,{\bf K}^{*} {\bf I}\,-\,{\bf S}, \label{eq:rad_transfer_peo}\\where :math:`{\bf K}^{*}={\bf K}/{\eta_I}` and\end{aligned}\end{align} \]\({\bf S}=\bm{\epsilon}/{\eta_I}\). The formal solution of this equation can be seen in eq. (23) of :raw-latex:`\cite{trujillo03}`.
The second one, whose formal solution does not require the use of the above-mentioned evolution operator is :raw-latex:`\citep[e.g.,][]{rees_delo89}`
\[ \begin{align}\begin{aligned} {{d}\over{d{\tau}}}{\bf I}\,=\,{\bf I}\,-\,{\bf S}_{\rm eff}, \label{eq:rad_transfer_delo}\\where the effective source-function vector\end{aligned}\end{align} \]\(\,{\bf S}_{\rm eff}\,=\,{\bf S}\,-\, {\bf K}^{'}{\bf I},\,\,\,\) being \(\,{\bf K}^{'}={\bf K}^{*}-{\bf 1}\) (with \(\bf 1\) the unit matrix). The formal solution of this equation can be seen in eq. (26) of :raw-latex:`\cite{trujillo03}`.
Once the coefficients \(\epsilon_I\) and \(\epsilon_X\) (with \(X=Q,U,V\)) of the emission vector and the coefficients \(\eta_I\), \(\eta_X\), and \(\rho_X\) of the \(4\times4\) propagation matrix are known at each point within the medium it is possible to solve formally Eq. ([eq:rad_transfer_peo]) or Eq. ([eq:rad_transfer_delo]) for obtaining the emergent Stokes profiles for any desired line of sight. Our computer program considers the following levels of sophistication for the solution of the radiative transfer equation:
Numerical Solutions. The most general case, where the properties of the slab vary along the ray path, has to be solved numerically. To this end, two efficient and accurate methods of solution of the Stokes-vector transfer equation are those proposed by :raw-latex:`\cite{trujillo03}` (see his eqs. (24) and (27), respectively). The starting points for the development of these two numerical methods were Eq. ([eq:rad_transfer_peo]) and Eq. ([eq:rad_transfer_delo]), respectively. Both methods can be considered as generalizations, to the Stokes-vector transfer case, of the well-known short characteristics method for the solution of the standard (scalar) transfer equation.
Exact analytical solution of the problem of a constant-property slab including the magneto-optical terms of the propagation matrix. For the general case of a constant-property slab of arbitrary optical thickness we actually have the following analytical solution, which can be easily obtained as a particular case of eq. (24) of :raw-latex:`\cite{trujillo03}`:
\[{\bf I}={\rm e}^{-{\mathbf{K}^{*}}\tau}\,{\bf I}_{\rm sun}\,+\,\left[{\mathbf{K}^{*}}\right]^{-1}\, \left( \mathbf{1} - {\rm e}^{-{\mathbf{K}^{*}}\tau} \right) \,\mathbf{S}, \label{eq:slab_peo}\]where \(\mathbf{I}_{\rm sun}\) is the Stokes vector that illuminates the slab’s boundary that is most distant from the observer. We point out that the exponential of the propagation matrix \({\mathbf{K}^{*}}\) has an analytical expression similar to eq. (8.23) in :raw-latex:`\cite{landi_landolfi04}`.
Approximate analytical solution of the problem of a constant-property slab including the magneto-optical terms of the propagation matrix. An approximate analytical solution to the constant-property slab problem can be easily obtained as a particular case of eq. (27) of :raw-latex:`\cite{trujillo03}`:
\[\mathbf{I} = \left[ \mathbf{1}+\Psi_0 \mathbf{K}' \right]^{-1} \left[ \left( e^{-\tau} \mathbf{1} - \Psi_M \mathbf{K}' \right) \mathbf{I}_{\rm sun} + (\Psi_M+\Psi_0) \mathbf{S} \right], \label{eq:slab_delo}\]where the coefficients \(\Psi_M\) and \(\Psi_0\) depend only on the optical thickness of the slab at the frequency and line-of-sight under consideration, since their expressions are:
\[\begin{split}\begin{aligned} \Psi_M&=& \frac{1-e^{-\tau}}{\tau} - e^{-\tau},\nonumber \\ \Psi_0 &=&1-\frac{1-e^{-\tau}}{\tau}.\end{aligned}\end{split}\]Note that Eq. ([eq:slab_delo]) for the emergent Stokes vector is the one used by :raw-latex:`\cite{trujillo_asensio07}` for investigating the impact of atomic level polarization on the Stokes profiles of the He i 10830 Å multiplet. We point out that, strictly speaking, it can be considered only as the exact analytical solution of the optically-thin constant-property slab problem [3]. The reason why Eq. ([eq:slab_delo]) is, in general, an approximate expression for calculating the emergent Stokes vector is because its derivation assumes that the Stokes vector within the slab varies linearly with the optical distance. However, it provides a fairly good approximation to the emergent Stokes profiles (at least for all the problems we have investigated in this paper). Moreover, the results of fig. 2 of :raw-latex:`\cite{trujillo_asensio07}` remain also virtually the same when using instead the exact Eq. ([eq:slab_peo]), which from a computational viewpoint is significantly less efficient than the approximate Eq. ([eq:slab_delo]).
Exact analytical solution of the problem of a constant-property slab when neglecting the second-order terms of the Stokes-vector transfer equation. Simplified expressions for the emergent Stokes vector can be obtained when \(\epsilon_I{\gg}\epsilon_X\) and \(\eta_I{\gg}(\eta_X,\rho_X)\), which justifies to neglect the second-order terms of Eq. ([eq:rad_transfer]). The resulting approximate formulae for the emergent Stokes parameters are given by eqs. (9) and (10) of :raw-latex:`\cite{trujillo_asensio07}`, which are identical to those used by :raw-latex:`\cite{trujillo_merenda05}` for modeling the Stokes profiles observed in solar chromospheric spicules. We point out that there is a typing error in the sentence that introduces such eqs. (9) and (10) in :raw-latex:`\cite{trujillo_asensio07}`, since they are obtained only when the above-mentioned second-order terms are neglected in Eq. ([eq:rad_transfer]), although it is true that there are no magneto-optical terms in the resulting equations.
Optically thin limit. Finally, the most simple solution is obtained when taking the optically thin limit (\(\tau{\ll}1\)) in the equations reported in the previous point, which lead to the equations (11) and (12) of :raw-latex:`\cite{trujillo_asensio07}`. Note that if \(\mathbf{I}_{\rm sun}=0\) (i.e., \(I_0=X_0=0\)), then such optically thin equations imply that \({X/I}\,{\approx}\,{\epsilon_X}/{\epsilon_I}\).
The coefficients of the emission vector and of the propagation matrix depend on the multipolar components, \(\rho^K_Q(J,J^{'})\), of the atomic density matrix. Let us recall now the meaning of these physical quantities and how to calculate them in the presence of an arbitrary magnetic field under given illumination conditions.
The multipolar components of the atomic density matrix¶
We quantify the atomic polarization of the atomic levels using the multipolar components of the atomic density matrix. We assume that the atom can be correctly described under the framework of the \(L\)-\(S\) coupling :raw-latex:`\citep[e.g.,][]{condon_shortley35}`. The different \(J\)-levels are grouped in terms with well defined values of the electronic angular momentum \(L\) and the spin \(S\). We neglect the influence of hyperfine structure and assume that the energy separation between the \(J\)-levels pertaining to each term is very small in comparison with the energy difference between different terms. Therefore, we allow for coherences between different \(J\)-levels pertaining to the same term but not between the \(J\)-levels pertaining to different terms. As a result, we can represent the atom under the formalism of the multi-term atom discussed by :raw-latex:`\cite{landi_landolfi04}`.
In the absence of magnetic fields the energy eigenvectors can be written using Dirac’s notation as \(|\beta L S J M\rangle\), where \(\beta\) indicates a set of inner quantum numbers specifying the electronic configuration. In general, if a magnetic field of arbitrary strength is present, the vectors \(|\beta L S J M\rangle\) are no longer eigenfunctions of the total Hamiltonian and \(J\) is no longer a good quantum number. In this case, the eigenfunctions of the full Hamiltonian can be written as the following linear combination:
the energy eigenstates belonging to the subspace corresponding to assigned values of the quantum numbers \(\beta\), \(L\), \(S\), and \(M\), and where the coefficients \(C_J^j\) can be chosen to be real.
In the presence of a magnetic field sufficiently weak so that the magnetic energy is much smaller than the energy intervals between the \(J\)-levels, the energy eigenvectors are still of the form \(|\beta L S J M\rangle\) (\(C_J^j(\beta L S, M) \approx \delta_{Jj}\)), and the splitting of the magnetic sublevels pertaining to each \(J\)-level is linear with the magnetic field strength. For stronger magnetic fields, we enter the incomplete Paschen-Back effect regime in which the energy eigenvectors are of the general form given by Eq. ([eq:eigenfunctions_total_hamiltonian]), and the splitting among the various \(M\)-sublevels is no longer linear with the magnetic strength. If the magnetic field strength is further increased we eventually reach the so-called complete Paschen-Back effect regime, where the energy eigenvectors are of the form \(|L S M_L M_S\rangle\) and each \(L\)-\(S\) term splits into a number of components, each of which corresponding to particular values of (\(M_L+2M_S\)).
Within the framework of the multi-term atom model the atomic polarization of the energy levels is described with the aid of the density matrix elements
expression of the eigenfunctions of the total Hamiltonian given by Eq. ([eq:eigenfunctions_total_hamiltonian]), the density matrix elements can be rewritten as:
on the basis of the eigenvectors \(| \beta L S J M\rangle\).
Following :raw-latex:`\cite{landi_landolfi04}`, it is helpful to use the spherical statistical tensor representation, which is related to the previous one by the following linear combination:
on Racah algebra.
Statistical equilibrium equations¶
In order to obtain the \({^{\beta LS}\rho^K_Q(J,J')}\) elements we have to solve the statistical equilibrium equations. These equations, written in a reference system in which the quantization axis (\(Z\)) is directed along the magnetic field vector and neglecting the influence of collisions, can be written as :raw-latex:`\citep{landi_landolfi04}`:
account the influence of the magnetic field on the atomic level polarization. This term has its simplest expression in the chosen magnetic field reference frame :raw-latex:`\citep[see eq. 7.41 of][]{landi_landolfi04}`. In any other reference system, a more complicated expression arises. The second, third and fourth terms account, respectively, for coherence transfer due to absorption from lower levels (\(\mathbb{T}_A\)), spontaneous emission from upper levels (\(\mathbb{T}_E\)) and stimulated emission from upper levels (\(\mathbb{T}_S\)). The remaining terms account for the relaxation of coherences due to absorption to upper levels (\(\mathbb{R}_A\)), spontaneous emission to lower levels (\(\mathbb{R}_E\)) and stimulated emission to lower levels (\(\mathbb{R}_S\)), respectively.
The stimulated emission and absorption transfer and relaxation rates depend explicitly on the radiation field properties :raw-latex:`\citep[see eqs. 7.45 and 7.46 of][]{landi_landolfi04}`. The symmetry properties of the radiation field are accounted for by the spherical components of the radiation field tensor:
The quantities \(\mathcal{T}^K_Q(i,\mathbf{\Omega})\) are spherical tensors that depend on the reference frame and on the ray direction \(\mathbf{\Omega}\). They are given by
defined by the line-of-sight \(\mathbf{\Omega}\) and by the polarization unit vectors \(\mathbf{e}_1\) and \(\mathbf{e}_2\) into the reference system of the magnetic field, while \(\mathcal{D}^K_{PQ}(R')\) is the usual rotation matrix :raw-latex:`\citep[e.g.,][]{edmonds60}`. Table 5.6 in :raw-latex:`\cite{landi_landolfi04}` gives the \(\mathcal{T}^K_Q(i,\mathbf{\Omega})\) values for each Stokes parameter \(S_i\) (with \(S_0=I\), \(S_1=Q\), \(S_2=U\) and \(S_3=V\)).
Emission and absorption coefficients¶
Once the multipolar components \({^{\beta L S}\rho^{K}_{Q}(J,J') }\) are known, the coefficients \(\epsilon_I\) and \(\epsilon_X\) (with \(X=Q,U,V\)) of the emission vector and the coefficients \(\eta_I\), \(\eta_X\), and \(\rho_X\) of the propagation matrix for a given transition between an upper term \((\beta L_u S)\) and an lower term \((\beta L_\ell S)\) can be calculated with the expressions of §7.6.b in :raw-latex:`\cite{landi_landolfi04}`. These radiative transfer coefficients are proportional to the number density of atoms, \(\mathcal{N}\). Their defining expressions contain also the Voigt profile and the Faraday-Voigt profile :raw-latex:`\citep[see \S5.4 in][]{landi_landolfi04}`, which involve the following parameters: \(a\) (i.e., the reduced damping constant), \(v_\mathrm{th}\) (i.e., the velocity that characterizes the thermal motions, which broaden the line profiles), and \(v_\mathrm{mac}\) (i.e., the velocity of possible bulk motions in the plasma, which produce a Doppler shift).
It is important to emphasize that the expressions for the emission and absorption coefficients and those of the statistical equilibrium equations are written in the reference system whose quantization axis is parallel to the magnetic field. The following equation indicates how to obtain the density matrix elements in a new reference system:
rotation matrix for the rotation \(R\) that carries the old reference system into the new one.
Inversion¶
Our inversion strategy is based on the minimization of a merit function that quantifies how well the Stokes profiles calculated in our atmospheric model reproduce the observed Stokes profiles. To this end, we have chosen the standard \(\chi^2\)–function, defined as:
\(\sigma_i^2(\lambda_j)\) is the variance associated to the \(j\)-th wavelength point of the \(i\)-th Stokes profiles. The minimization algorithm tries to find the value of the parameters of our model that lead to synthetic Stokes profiles \(S_i^\mathrm{syn}\) with the best possible fit to the observations. For our slab model, the number of parameters (number of dimensions of the \(\chi^2\) hypersurface) lies between 5 and 7, the maximum value corresponding to the optically thick case. The magnetic field vector (\(B\), \(\theta_B\) and \(\chi_B\)), the thermal velocity (\(v_\mathrm{th}\)) and the macroscopic velocity (\(v_\mathrm{mac}\)) are always required. This set of parameters is enough for the case of an optically thin slab. In order to account for radiative transfer effects, we need to define the optical depth of the slab along its normal direction and at a suitable reference wavelength (e.g., the central wavelength of the red blended component for the 10830 Å multiplet). In addition, we may additionally need to include the damping parameter (\(a\)) of the Voigt profile if the wings of the observed Stokes profiles cannot be fitted using Gaussian line profiles.
Global Optimization techniques¶
In order to avoid the possibility of getting trapped in a local minimum of the \(\chi^2\) hypersurface, global optimization methods have to be used. We have chosen the DIRECT algorithm :raw-latex:`\citep{Jones_DIRECT93}`, whose name derives from one of its main features: dividing rectangles. The idea is to recursively sample parts of the space of parameters, improving in each iteration the location of the part of the space where the global minimum is potentially located. The decision algorithm is based on the assumption that the function is Lipschitz continuous :raw-latex:`\citep[see][for details]{Jones_DIRECT93}`. The method works very well in practice and can indeed find the minimum in functions that do not fulfill the condition of Lipschitz continuity. The reason is that the DIRECT algorithm does not require the explicit calculation of the Lipschitz constant but it uses all possible values of such a constant to determine if a region of the parameter space should be broken into subregions because of its potential interest :raw-latex:`\citep[see][for details]{Jones_DIRECT93}`.
Since the intensity profile is not very sensitive to the presence of a magnetic field (at least for magnetic field strengths of the order of or smaller than 1000 G), we have decided to estimate the optical thickness of the slab, the thermal and the macroscopic velocity of the plasma and the damping constant by using only the Stokes \(I\) profile, and then to determine the magnetic field vector by using the polarization profiles. The full inversion scheme begins by applying the DIRECT method to obtain a first estimation of the indicated four parameters by using only Stokes \(I\). Afterwards, some LM iterations are carried out to refine the initial values of the model’s parameters obtained in the previous step. Once the LM method has converged, the inferred values of \(v_\mathrm{th}\), \(v_\mathrm{mac}\) (together with \(a\) and \(\Delta \tau\), when these are parameters of the model) are kept fixed in the next steps, in which the DIRECT method is used again for obtaining an initial approximation of the magnetic field vector (\(B\),\(\theta_B\),\(\chi_B\)). According to our experience, the first estimate of the magnetic field vector given by the DIRECT algorithm is typically very close to the final solution. Nevertheless, some iterations of the LM method are performed to refine the value of the magnetic field strength, inclination and azimuth. In any case, although we have found very good results with this procedure, the specific inversion scheme is fully configurable and can be tuned for specific problems.
Our experience has proved that the following strategy is appropriate for inverting prominences. Two initial DIRECT+LM cycles with weights \((1,0,0,0)\) to invert the thermodynamical parameters. Then, two DIRECT+LM cycles in which \(B\), \(\theta_B\) and \(\chi_B\) are left free with weights \((0,0.1,0.1,1)\) which tries to set the correct polarity of the field given by Stokes \(V\). An additional LM cycle in which we fit only \(\theta_B\) and \(\chi_B\) with the weights \((0,1,1,0.3)\) and a last LM cycle with weights \((0,0.3,0.3,1)\) leaving the full magnetic field vector free.
Convergence¶
We let the DIRECT algorithm locate the global minimum in a region whose hypervolume is \(V\). This hypervolume is obtained as the product of the length \(d_i\) of each dimension associated with each of the \(N\) parameters:
algorithm has discarded some of the hyperrectangles, its size along each dimension is approximately decreased by a factor \(f^{1/N}\). In order to end up with a small region where the global minimum is located, many subdivisions are necessary, thus requiring many function evaluations.
The most time consuming part of any optimization procedure is the evaluation of the merit function. The DIRECT algorithm needs only a reduced number of evaluations of the merit function to find the region where the global minimum is located. For this reason, we have chosen it as the initialization part of the LM method. Since the initialization point is close to the global minimum, the LM method, thanks to its quadratic behavior, rapidly converges to the minimum.
Stopping criterium¶
We have used two stopping criteria for the DIRECT algorithm. The first one is stopping when the ratio between the hypervolume where the global minimum is located and the original hypervolume is smaller than a given threshold. This method has been chosen when using the DIRECT algorithm as an initialization for the LM method, giving very good results. The other good option, suggested by :raw-latex:`\cite{Jones_DIRECT93}`, is to stop after a fixed number of evaluations of the merit function.
Ambiguities in the Hanle effect in the saturation regime¶
In the saturation regime of the Hanle effect, Stokes \(Q\) and \(U\) are insensitive to the field strength, but are sensitive to the geometry of the field. For a \(J=0 \to J=1\) transition, the linear polarization can be written as:
polarization amplitude depends on both the angle between the vertical and the magnetic field and between the magnetic field and the line-of-sight (LOS).
The coordinates of the magnetic field vector \(\mathbf{B}\) in the reference system of the vertical and the reference system of the LOS are:
we find that the following has to be fulfilled, given that the magnetic field vector is the same in both reference systems:
following transformations between the angles in the vertical reference system and the LOS reference system:
square root and take the positive value. In order to transform from one reference system to the other, we can compute the inclination easily by inverting the sinus or the cosinus. However, the situation is different for the azimuth, because the range of variation is \([-\pi,\pi]\). Therefore, one has to compute the cosinus and the sinus separately and the decide which is the correct quadrant fo the angle in terms of the signs of both quantities.
Four possible kinds of ambiguities can exist for the Stokes \(Q\) and \(U\) parameters. The idea is that \(\Phi_B\) can be modified and still obtain the same \(Q\) and \(U\) by properly adjusting the value of \(\Theta_B\). It is clear that, given that the term that can be used to compensate for the change in the azimuth on the LOS reference system is the same for Stokes \(Q\) and \(U\), we can only compensate for changes in the sign. Therefore, we have the following potential ambiguities:
keeps the value of \(Q\) and \(U\) unchanged. Therefore, once we find a solution to the inversion problem in the form of the pair \((\theta_B,\phi_B)\), we can find the remaining solutions in the saturation regime following the recipes that we present now. Remember that, unless one knows the polarity of the field, or in other words, the sign \(\cos\Theta_B\), the number of potential ambiguous solutions is 8. If the polarity of the field is known, the number is typically reduced to 4 (or 2 if no 90\(^\circ\) ambiguity is present).
PhiB’=PhiB¶
Under this change, we have that
vertical and the LOS, we have to solve the following equation:
we end up with the following equation to be solved:
\(t=\pm \sqrt{Z}\), resulting in:
these solutions, we have to take only the real solutions which are larger than 0, given the range of variation of \(\Theta_B\):
\(\Theta_B' = \arcsin t\). Note that, for a fixed value of \(t\), two values of \(\Theta_B'\) are possible. We choose the correct one by evaluating the expressions for \(Q\) and \(U\) and testing which of the two possible choices give the values equal (or very similar) to the original ones.
The angles \((\theta_B,\phi_B)\) are obtained by doing the transformation from \((\Theta_B',\Phi_B)\) to the vertical reference system.
PhiB’=PhiB+pi¶
Under this change, we have:
but now
The angles \((\theta_B,\phi_B)\) are obtained by doing the transformation from \((\Theta_B',\Phi_B+\pi)\) to the vertical reference system.
PhiB’=PhiB+pi/2¶
Under this change, we have:
but now
The angles \((\theta_B,\phi_B)\) are obtained by doing the transformation from \((\Theta_B',\Phi_B+\pi/2)\) to the vertical reference system.
PhiB’=PhiB-pi/2¶
Under this change, we have:
but now
The angles \((\theta_B,\phi_B)\) are obtained by doing the transformation from \((\Theta_B',\Phi_B-\pi/2)\) to the vertical reference system.
11 natexlab#1#1
, E. U., & Shortley, G. H. 1935, The Theory of Atomic Spectra (Cambridge: Cambridge University Press)
, A. R. 1960, Angular Momentum in Quantum Mechanics (Princeton University Press)
, D. R., Perttunen, C. D., & Stuckmann, B. E. 1993, Journal of Optimization Theory and Applications, 79, 157
, E., & Landi Deglinnocenti, M. 1985, Sol. Phys., 97, 239
, E., & Landolfi, M. 2004, Polarization in Spectral Lines (Kluwer Academic Publishers)
, K. 2000, in Allen’s Astrophysical Quantities, ed. A. N. Cox (New York: Springer Verlag and AIP Press)
, D. E., Durrant, C. J., & Murphy, G. A. 1989, ApJ, 339, 1093
, J. 2003, in Stellar Atmosphere Modeling, ed. I. Hubeny, D. Mihalas, & K. Werner, ASP Conf. Ser. 288 (San Francisco: ASP), 551
, J., & Asensio Ramos, A. 2007, ApJ, 655, 642
, J., Merenda, L., Centeno, R., Collados, M., & Landi Degl’Innocenti, E. 2005, ApJ, 619, L191
| [1] | (an acronym for HAnle and ZEeman Light) is one of the IAC computer programs for the synthesis and inversion of Stokes profiles resulting from the joint action of the Hanle and Zeeman effects. |
| [2] | http://www.unidata.ucar.edu/software/netcdf/ |
| [3] | More precisely, when the optical thickness of the slab is small in comparison with the eigenvalues of the matrix \(\mathbf{K}'\). |


for board, f, b in build_branches:
f1 = factory.BuildFactory()
f1.workdir="system"
f1.addStep(
Repo(manifest_url=url, manifest_branch=b, manifest_file=f,))
f1.addStep(
Compile(name="clobber old output",command="rm -rf out"))
f1.addStep(
Compile(
name="compile everything",
command=buildcommand))
builddir="%s_%s" % (board, manifest_file)
b1 = BuilderConfig(
name=builddir,
slavenames=slaves,
builddir=builddir,
factory=f1)
builders.append(b1)


{% extends 'teamwork/base.html' %} {% block main_content %} {% if all_organization %}
| Organization Id | Organization Name | Departments | Team |
|---|---|---|---|
| {{organization.organization_id}} | {{organization.organization_name}} |
You dont have any Organization
{% endif %} {% endblock %}


Provides the tools needed to benchmark the R2 value corresponding to a certain acceptable noise level while also providing a rescaling function based on that noise level yielding a new value of R2 we refer to as R2k which is independent of both the number of degrees of freedom and the noise distribution function.
| Version: | 2.0 |
| Depends: | ggplot2, coin, grDevices, graphics, stats |
| Published: | 2016-01-19 |
| Author: | Joseph G Kreke, PhD; Harris, Inc. Sangeet Khemlani, PhD; Naval Research Laboratory. Greg Trafton, PhD; Naval Research Laboratory. |
| Maintainer: | Joseph G Kreke <jkreke2 at gmail.com> |
| License: | GPL-2 |
| NeedsCompilation: | no |
| CRAN checks: | pAnalysis results |
| Reference manual: | pAnalysis.pdf |
| Package source: | pAnalysis_2.0.tar.gz |
| Windows binaries: | r-devel: pAnalysis_2.0.zip, r-release: pAnalysis_2.0.zip, r-oldrel: pAnalysis_2.0.zip |
| OS X binaries: | r-release: pAnalysis_2.0.tgz, r-oldrel: pAnalysis_2.0.tgz |
| Old sources: | pAnalysis archive |
Please use the canonical form https://CRAN.R-project.org/package=pAnalysis to link to this page.


Also feel free to delete credits.html and env_styles.css as you don't need environment credits/readme anymore.
This environment setup by Alexander Tatchin @ github.com/sancau is free to use with no limitations.


Completed my under-graduate studies specialized in Information Technology from prestigious Anna university in the year 2014. I achieved an overall GPA of 3.63/4. The degree included major courses like Java, Web technology, Object Oriented programming, Software Project Management, Database Management Systems, Object Oriented Analysis and DesignDuring.
In the final year of my undergraduate studies, In a team of three, we built an app from scratch in android that helps people to test vision power deficiency and color blindness. It was built using Android SDK with backend database as DB2. The work was demoed live to more than 300 students and professors in my university and got published as a research paper in the IRAJ magazine (link). This project received recognition and got selected in the IEEE UKSim2014 conference at Cambridge University,London.
Completed two online courses from the University of Michigan : Introduction of HTML5 and Introduction of CSS3
Certified in Web Component Development using Java Technologies and Oracle Workforce Development training at NIIT.
comprehensive table
Institution name
Degree
Specialization
Year(From-To)
GPA
Vyasa Vidyalaya
High school
Computer Science
2007-2010
8.9/10
Anna university
Bachelors of Technology
Information technology
2010-2014
3.6/4
Dev Bootcamp
Diploma
Full stack web development
2017 (19weeks)
studying ...
CAREER
AX Functional Consultant in Microsoft Dynamics
After my under graduate studies, I felt inspired to start developing software for real-world use cases. This led me towards taking up a position as Functional Consultant in the Microsoft Gold-Partnered Company, CEM Business Solutions. CEM Business Solutions is one of the fastest growing IT companies, providing implementation services in the Microsoft Dynamics practices. During my time at CEM, I learnt about Dynamics ERP software AX RU8 version modules like payroll, Human resource management and inventory warehouse management.
I got the opportunity to work on three USA and two UAE client projects as a functional consultant interacting directly with the client enterprise teams. Assisted the clients in defining business requirements and prepared functional design documents and worked with the technical team members and assisted them in preparing technical design documents.Coordinated and trained the Project Core Team members (Business Key Users) at the client site.Working on these projects made me realize the impact of software engineering in everyday life.
Technology changes constantly, so it is important to learn multiple languages and frameworks, including Ruby, JavaScript, Rails, SQL, HTML and CSS as well as techniques to learn new programming languages quickly and effectively. DevBootcamp 19 week immersive program prepares students to be a full stack web developer. The program is divided into three sections
9 weeks Remote preparations
9 weeks Immersion in person learning
1 week Career training
Currently I am in second week and here is by schedule for this week


iCal Links
Use this these links to add the Springfield College Class of '68 calendar to your favorite calendar applications such as Microsoft Outlook or Mozilla Sunbird. To add these calendars just copy and paste these URLs into your application.
Alarm: All Events: webcal://www.springfieldcollege1968.com/ocapp/calendar/ical/data/?alarm=0 Categories:


--- layout: archive title: Zulip Chat Archive permalink: /stream/113488-general/topic/finite.20stuff.html ---
I'm really bad at manipulating finite sets in Lean. This is frustrating because everything about finite sets seem obvious. I'd be very grateful if someone could prove the following lemmas (the second one has the same assumption but a more precise conclusion):
import data.set.finite open set variables {ι : Type*} {α : Type*} {s : ι → set α} {t : set α} lemma finite_stuff (tfin : finite t) (h : t ⊆ ⋃ i, s i) : ∃ I : finset ι, t ⊆ ⋃ i ∈ I, s i := sorry lemma finite_stuff' (tfin : finite t) (h : t ⊆ ⋃ i, s i) : ∃ I : finset ι, ∃ σ : {i | i ∈ I} → set α, (∀ i, finite (σ i)) ∧ (∀ i, σ i ⊆ s i) ∧ t ⊆ ⋃ i, σ i := sorry
Of course I'm also interested if someone explains those lemmas should be stated like this and will be a pain to use.
This reminds me of https://github.com/leanprover-community/mathlib/blob/51553e36ff9ae93ee4fbfb05a39e5d04c71be565/src/linear_algebra/finsupp.lean#L434
@Patrick Massot I think the statements are fine. (Maybe I would use t : finset _
... To prove this, I would do something like
have : \forall x : (t : Type*), \ex i, x \in s i, choose this using f hf, let I := finset.image f t,
modulo minor tweaks
apparently Lean can't synthesize decidable equality on iota. I am assuming that this isn't an issue for Patrick...
example (α : Type*) (t : set α) [finite t] : fintype t := by apply_instance -- fails
I think you can do cases on the proof of finite t
is finite
even a typeclass?
no it isn't -- sorry. But still...
yeah, it's defined as nonempty (fintype t)
so just pop it open and use resetI
It's great that to prove this triviality I need to unfreeze local instances :-)
hey, you're the one that wants to use instances that aren't present in the statement
it's not needed for the statement and I'm not sure how it's being used in the proof
stupid mum_bUnion_iff wants the term to be in a set, not a finset :-)
How come mem_Union
is an iff and mem_bUnion
isn't?
probably because mem_bUnion
is too old
lemma finite_stuff (tfin : finite t) (h : t ⊆ ⋃ i, s i) : ∃ I : finset ι, t ⊆ ⋃ i ∈ I, s i := begin have : ∀ x : t, ∃ i, x.1 ∈ s i, rintros ⟨x, hx⟩, rcases h hx with ⟨_, ⟨i, rfl⟩, hi⟩, exact ⟨i, hi⟩, choose f hf using this, tactic.unfreeze_local_instances, cases tfin, use finset.image f finset.univ, intros x hx, rw mem_Union, use f ⟨x, hx⟩, rw mem_Union, existsi _, apply hf, rw finset.mem_image, use ⟨x, hx⟩, simp, end
That bit at the end could use some tidying
it looks like a term mode proof written vertically
that's how I roll
you should see my codewars solutions
@Patrick Massot in the second one, why not have sigma mapping to finset alpha? it's finset.unbind
then :-)
Did someone find a proof of finite t -> finite s \cap t
?
There should be a mem_fUnion
or possibly a mem_fUnion_iff...
lemma finite_stuff' (tfin : finite t) (h : t ⊆ ⋃ i, s i) : ∃ I : finset ι, ∃ σ : {i | i ∈ I} → set α, (∀ i, finite (σ i)) ∧ (∀ i, σ i ⊆ s i) ∧ t ⊆ ⋃ i, σ i := begin cases finite_stuff tfin h with I hI, use I, use (λ x, s x.1 ∩ t), split, { intro i, sorry}, -- finite t → finite s ∩ t split, { intro i, apply inter_subset_left}, { intros x hx, rw mem_Union, replace hI := hI hx, rw mem_Union at hI, cases hI with i hi, rw mem_Union at hi, cases hi with hi hsi, use ⟨i, hi⟩, split, exact hsi, exact hx} end
I'm not sure this is mathlib-ready </sarcasm>, and I assumed finite t -> finite s \cap t, but if it's just something you need now then there it is
I'm not sure these are term mode proofs really, because of the occasional rw mem_Union.
The proof of mem_Union
doesn't seem to be rfl
lemma finite_stuff' (tfin : finite t) (h : t ⊆ ⋃ i, s i) : ∃ I : finset ι, ∃ σ : (↑I:set ι) → set α, (∀ i, finite (σ i)) ∧ (∀ i, σ i ⊆ s i) ∧ t ⊆ ⋃ i, σ i := begin cases finite_stuff tfin h with I hI, use I, use (λ x, s x.1 ∩ t), split, { intro i, apply finite_subset tfin, apply inter_subset_right }, split, { intro i, apply inter_subset_left }, { intros x hx, rw mem_Union, replace hI := hI hx, rw mem_Union at hI, cases hI with i hi, rw mem_Union at hi, cases hi with hi hsi, use ⟨i, hi⟩, split, { exact hsi }, { exact hx } } end
Than you very much Kevin and Mario!
Mario, do you think we are missing intermediate lemmas here? It looks like a very long proof for such an obvious fact.
here's kevin's proof in term mode:
```lean lemma finite_stuff' (tfin : finite t) (h : t ⊆ ⋃ i, s i) : ∃ I : finset ι, ∃ σ : (↑I:set ι) → set α, (∀ i, finite (σ i)) ∧ (∀ i, σ i ⊆ s i) ∧ t ⊆ ⋃ i, σ i := let ⟨I, hI⟩ := finite_stuff tfin h in ⟨I, λ x, s x.1 ∩ t, λ i, finite_subset tfin (inter_subset_right _ _), λ i, inter_subset_left _ _, λ x hx, mem_Union.2 $ let ⟨i, hi, hsi⟩ := mem_bUnion_iff.1 (hI hx) in ⟨⟨i, hi⟩, hsi, hx⟩⟩
Nice :-)
although I did swap in the use of mem_bUnion_iff
To do that I would have had to understand how supr was implemented and I couldn't be bothered to dig
I don't think this is an unreasonably long proof, given the complexity of the statement itself. Once you set the logical manipulation aside the only actually interesting part is the last 3 lines of my version of the proof
I ctrl-clicked on mem_bUnion
and looked for neighbors
it was two lemmas previous
Do you think we should keep both version finite_stuff
and finite_stuff'
?
(with better names of course)
If you find it useful, I don't see why not
I usually try to find an appropriate constructive analogue for these sorts of things, that is, a function with the stated properties, since existentials have to be unpacked and lack global coherence of choices
In my question the first lemma was really meant as training for the second one.
I want to use only the second one.
If you can turn this lemma into a function that would be even better of course.
(in order to avoid unpacking the existential)
I feel like there is a simpler core underlying principle here
That was my question about missing lemmas.
like, you can swap forall and exists a la skolemization for finite sets
In the conclusion of finite_stuff'
, it would be better to replace t ⊆ ⋃ i, σ i
with t = ⋃ i, σ i
.
I didn't need this, but feel free to prove that stronger version!
what do you think of this formulation:
lemma finite_stuff'' (s : finset α) (P : α → ι → Prop) (h : ∀ x ∈ s, ∃ i, P x i) : ∃ t : finset ι, ∀ x ∈ s, ∃ i ∈ t, P x i := sorry
That certainly looks cleaner. Can you prove it and deduce Sébastien's version of the original question?
I think it's not quite enough to get the second version of the statement
Do we have an equiv e between finset X and Pi (s : set X), finite s, and the lemma that for x : X, x \in s iff x \in e s?
Hey, isn't this just the collection principle from zfc?
All I know is that it's a mathematical triviality so it wouldn't surprise me if the logicians called it a principle
I'm thinking of the version where you replace "finite" with "is a set" and depending on how you set things up it might be a theorem or an axiom
Like most principles
it's essentially a souped up version of replacement without the assumption that the relation is a function
Replacement says the image of a set is a set
right
here it's the image under a relation
A relation on X
and it's not really an image because you can take a subset
but you have to preserve "enough" of the original relation
is_monoid_hom f is unbundled monoid homs and it's a class. monoid_hom is bundled and it's a structure
finite s is unbundled finiteness and it's a structure. finset is bundled and a structure
Do we have a version sInter s
when s : finset (set X)
? This is why I used finite
everywhere instead of finset
.
I mentioned fUnion earlier (which doesn't exist)
I know I can write ⋂₀ s.to_set
but it looks silly.
you can use the coercion as I did above
If we did have something like that, I would prefer it generalize to lattices. I would call it finset.inf
ok hey look what I found
Kevin Buzzard said:
finite s is unbundled finiteness and it's a structure. finset is bundled and a class
Whut?? Is finset
a class?
finset isn't a class
It should be just a structure
, right?
Fixed
It's the wrong way around
arguably, finite s
should be called is_finite s
. Is that your point?
I think the problem, grammatically, is that finite
is an adjective and monoid_hom
is a noun
I am saying that the class/structure choice is different in the two situations for both the unbundled and the bundled concepts
I think I have this straight now
Oh I see. Well, using typeclasses for these things has always been dubious, that's why we're moving away from them
I'm saying that either finset should be a structure or subgroup should be a class
Reasoning purely by analogy
finset is a structure
subgroup is also a structure
I see so I still have one error
I'm failing to see past the typo to the point
Is finite a class?
I'm on mobile right now
Because is_subgroup is a class
finite
is not a class, is_subgroup
is a class, and yes this is inconsistent
my proposed solution is to delete is_subgroup
and call it a day
Is finite
deprecated? Because is_subgroup
is, kinda
finite is not deprecated, it is meant to be a proposition to talk about finiteness in other positions
for example you can meaningfully negate it
This is some sort of indication that one should stick to finsets where one can though
Bundled ftw
We should have infinset
import topology.subset_properties import data.set.finite open set variables {ι : Type*} {α : Type*} {s : ι → set α} {t : set α} lemma finite_stuff (tfin : finite t) (h : t ⊆ ⋃ i, s i) : ∃ I : finset ι, t ⊆ ⋃ i ∈ I, s i := begin letI : topological_space α := ⊥, haveI : discrete_topology α := ⟨rfl⟩, exact tfin.compact.elim_finite_subcover _ (λ i, is_open_discrete _) h end
Brilliant hack!
Too bad this topology stuff come too late.
You still get the jury special honorary mention.
It's too late because I want to put this below order.filter.basic
. But it's also good to see that the form of the statement is used elsewhere in mathlib.
Yes, I expected it to be easy but I didn't realize it would be quite this easy.
Mario Carneiro said:
for example you can meaningfully negate it
BTW, is it normal that push_neg
on not set.finite
cannot rename it as set.infinite
, I guess it has to do with simp
(?) ?
(I had to do a rw set.infinite
in order to get the nice infinite S
rather than not set.finite S
)
push_neg
needs explicit support for each of these things. Seems like a good PR
Mario Carneiro said:
push_neg
needs explicit support for each of these things. Seems like a good PR
Sounds good, thanks
Yes, every end-game negation in push_neg is hardcoded.
Damn, I was trying to put this finite stuff in the proper place before PRing, and guess what? https://leanprover-community.github.io/mathlib_docs/data/set/finite.html#set.finite_subset_Union
So... why did library_search
not find this?
It's very unlikely that library_search will find longer statements, because the probability that you spell the theorem the same way as the library decreases exponentially with the length of the theorem
Because of our rigid naming convention and fairly deterministic file organization it's much likely to notice a collision the way Patrick did, by putting it in its proper place and seeing something already there, or getting a name conflict with a duplicate of your theorem
Yes, I'm trying to fit in the more precise version, and it's a pain.
Because of mathematically empty differences between my statement and the one already in mathlib.
this is also why I highly recommend looking at sources for relevant files as a theorem discovery strategy
{% endraw %}Last updated: Apr 24 2020 at 19:02 UTC


Select a category of AI-continued passages:
{{group.description|safe}}
Category will be selected randomly each round.


IBM Subversive
Home
(current)
Storyline
Vulnerabilities
About Us
The Team
Okhae Adeleye
Okhae Adeleye
Callum McClure
Callum McClure
Rob
Rob
Chris
Chris


Home
Portfolio
Services
Team
About us
Contact
Contact us!
Name:
First name:
E-mail:
Subject:
Message:
Send


Preparation time
1-2 hours
Cooking time
30 mins to 1 hour
Serves
Serves 2
Dietary
In this delicious starter the beetroot is cooked from raw, rather than being blanched first, which concentrates its wonderful earthy flavour.
For this recipe you will need 2 x 12cm/4½in ovenproof blini pans and 2 x 11cm/4¼in metal rings.
For the pastry base, line a baking sheet with greaseproof paper. Cut the pastry into two 13cm/5in discs using a chef's ring or a small plate and place on the lined baking sheet. Transfer to the fridge, or ideally the freezer, for at least 1 hour, to prevent the pastry being sticky.
Preheat the oven to 180C/160C Fan/Gas 4.
To prepare the beetroot, cut the root off each one. Using a mandolin set to a thickness of 1mm, slice into thin discs and transfer to a bowl. Season with salt and pepper. Stir in the warm butter to ensure each slice of beetroot is evenly coated.
To cook the beetroot, place a 9cm/3½in metal ring in a 12cm/4½in blini pan. Layer the seasoned beetroot discs inside the ring in a rosace pattern 3 layers deep. The metal ring will facilitate the building of the beetroot and keep it upright and in a perfect circle. Repeat this with the other blini pan and metal ring. Cut a circle of baking paper to the same size as the blini pan.
Lift the metal ring off the beetroot and lay the baking paper on top of the beetroot rosace, then press the ring back over the rosace. (By placing the ring over the paper you will trap the steam trying to escape, which will keep the beetroot beautifully moist.) Cook the beetroot rosaces on a medium heat for 2 minutes, until the sides start to bubble. Some juices from the beetroot will boil in the pan – this is important as it speeds up the cooking of the beetroot in the oven and gives a nice light caramelisation to the beetroot.
Transfer the beetroot to the oven for 10–12 minutes. Remove from the oven, leave to rest and cool completely. Lift off the rings and greaseproof paper from the cooled beetroot rosaces and turn them out on to a small plate (the coloured side, with its golden rosace pattern will be facing upwards). Set aside.
For the onion jam, in a saucepan over a medium heat, melt the butter and add the onion, salt and pepper. Cook for 35–40 minutes, covered with a lid, until softened but not caramelised. Stir every 5 minutes to prevent the onions from burning. Deglaze the pan with the vinegar, scraping any browned bits from the bottom with a wooden spoon, and boil for 20 seconds. Taste and adjust the seasoning if necessary. Leave to cool completely.
To build and cook the beetroot tarts, divide the onion jam equally between the two pastry discs and with the back of a spoon spread the onions to a thin layer leaving a gap of 1cm/½in around the edge. Lightly brush the pastry edges with a thin coating of egg wash and sprinkle them with the black pepper and powdered orange and thyme, if using. Using a palette knife, lift each golden rosace into the centre of each pastry base. Place a piece of baking parchment over each of the tarts and place a cooling rack on top of them. Transfer to the oven for 20 minutes, or until the sides of the pastry are golden-brown. The parchment paper and cooling rack on the tarts help keep the moisture in the beetroot; it will also ensure the pastry rises evenly and the beetroot slices do not curl whilst cooking.
To make the Jerez vinaigrette, mix all the ingredients together in a small bowl. Taste and adjust the seasoning if necessary.
To serve, dress the leaves with half the vinaigrette and arrange on each plate. Scatter the cottage cheese over the salad. Brush the remaining vinaigrette over the beetroot tarts to give flavour and a beautiful glaze and serve immediately.


Nebulas are nurseries where stars are born. Experience the magic of having a Nebula birth your star in a galaxy.
Latest LTS version of:


| DOSE: |
10 tablets |
oral |
DXM |
(pill / tablet) |
[Erowid Warning: Most Coricidin contains CPM (Chlorpheniramine Maleate) which can be dangerous in high doses. See DXM Brand Warnings for more info.]
It was the first time I'd ever done it and I was looking for a quick high. I was at my friends house and we went to the store where I bought a box of Corcidin HBP. We got back to her house and I sat in the recliner and downed 10 tablets in 2 sets of 5. I sat in the chair for like an hour and didn't feel anything so I decided to leave. I got up and could feel the medicine just drop in my system.
[Erowid Note: Driving while intoxicated or tripping is dangerous and irresponsible because it endangers other people. Don't do it!]
I didn't think anything of it and got in my car and drove home.  I had this dizzy feeling like I was about to pass out. I got home and layed on the couch and had this feeling of dizziness. It felt like the whole room was spinning and after an hour I fell asleep. Well I woke up about 2 hours later only to find I was still on the DXM trip. I got up and felt cold and my whole body was numb. I put my hand to my chest and couldn't even feel my heart beating.
I thought I was dead or about to die so I got in the shower and had the water on as cold as it could get. I stood in there for about 10 minutes to shock myself awake and about that time 2 of my friends came over. I got out of the shower and walked in the living room and all I could remember was them both looking at me and telling me how white I was and how sick I looked. I felt terrible. I ended up sitting in the living room and eating something, then we went and walked around the block and I felt fine after we walked. I wouldn't recommend the Corcidin but I'm going to try other ones that have DXM as the only active ingredient.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


[gecode-users] External input and outputs in GECODE ....
Guido Tack
tack at gecode.org
Thu Apr 22 11:37:04 CEST 2010
Claudio Cesar de Sá wrote:
> For the extensive tests in a Gecode program, two doubts:
>
> 1. For data input I will be using an external file. Such the execution in Linux console works like:
>
> claudio at goedel:~$ ./my-executable < input.txt
>
> I have the idea how it works in C. Any modification in main( .... argc , argv ....) for Gecode to use it?
That's not really a Gecode question. The main function doesn't work any differently from any other C or C++ program, so you can do the same things there.
> 2. In my program I need all the outputs.
> opt.solutions(0); // all solutions ===> OK it's fine
> but I would like to collect them, one by one, and processing them.
>
> I think to process them inside on print(std::ostream& os) const ... is it correct?
>
> Should be best to write in a file and following by a pos processing or filtering, in another program ?
>
> Surely someone already done it before.
You can either print all solutions and post process them, or use the search engines directly without the Driver infrastructure (see the tutorial documentation, Section 2.2 and 9.4).
Cheers,
Guido
--
Guido Tack, http://people.cs.kuleuven.be/~guido.tack/
More information about the users
mailing list


A guy approached as a product seller in victims house. then he entered to house by making excuses and after some half an hour he got murdered with the help of sharp knife used to cut chickens.


Komodo
introductions
Are you a developer or blockchain enthusiast? Introduce yourself. Please note that normal chat messages will be removed. Go to #general to start a discussion or ask a follow-up question.
100 messages
Before 05-Dec-19 12:00 AM
YAGPDB.xyz
BOT
16-Oct-19 08:37 AM
Komodo User#6429<PHONE_NUMBER>72459530)
New user joined waiting to be verified as a human
Komodo User#6429<PHONE_NUMBER>72459530)
User successfully verified
farl
16-Oct-19 10:10 AM
Verified!
YAGPDB.xyz
BOT
16-Oct-19 02:59 PM
bandoe#4893<PHONE_NUMBER>38637335)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
16-Oct-19 03:09 PM
bandoe#4893<PHONE_NUMBER>38637335)
Kicked for not verifying within deadline
noashh
16-Oct-19 07:27 PM
YAGPDB.xyz
BOT
16-Oct-19 08:34 PM
ricecrypto#6902<PHONE_NUMBER>31535637)
New user joined waiting to be verified as a human
ricecrypto#6902<PHONE_NUMBER>31535637)
User successfully verified
YAGPDB.xyz
BOT
16-Oct-19 09:22 PM
kal#9420<PHONE_NUMBER>37675296)
New user joined waiting to be verified as a human
kal#9420<PHONE_NUMBER>37675296)
User successfully verified
YAGPDB.xyz
BOT
17-Oct-19 08:34 AM
komodouser#1167<PHONE_NUMBER>48388385)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
17-Oct-19 08:41 AM
komodouser#1167<PHONE_NUMBER>48388385)
User successfully verified
razno001#9285<PHONE_NUMBER>47566593)
New user joined waiting to be verified as a human
razno001#9285<PHONE_NUMBER>47566593)
User successfully verified
YAGPDB.xyz
BOT
17-Oct-19 12:49 PM
annejav#4085<PHONE_NUMBER>52124416)
New user joined waiting to be verified as a human
annejav#4085<PHONE_NUMBER>52124416)
User successfully verified
YAGPDB.xyz
BOT
17-Oct-19 06:10 PM
pod#2884<PHONE_NUMBER>39572766)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
17-Oct-19 10:05 PM
Hans_Schmidt#0745<PHONE_NUMBER>72839464)
New user joined waiting to be verified as a human
Hans_Schmidt#0745<PHONE_NUMBER>72839464)
User successfully verified
!Ratstang CryptocurrencyCheckout#4037<PHONE_NUMBER>30965761)
New user joined waiting to be verified as a human
!Ratstang CryptocurrencyCheckout#4037<PHONE_NUMBER>30965761)
User successfully verified
YAGPDB.xyz
BOT
17-Oct-19 11:03 PM
Dilago#2133<PHONE_NUMBER>45060865)
New user joined waiting to be verified as a human
Dilago#2133<PHONE_NUMBER>45060865)
User successfully verified
YAGPDB.xyz
BOT
18-Oct-19 09:52 AM
Sully#3164<PHONE_NUMBER>37754132)
New user joined waiting to be verified as a human
Sully#3164<PHONE_NUMBER>37754132)
User successfully verified
YAGPDB.xyz
BOT
18-Oct-19 04:18 PM
xpunk#4682<PHONE_NUMBER>32017154)
New user joined waiting to be verified as a human
xpunk#4682<PHONE_NUMBER>32017154)
User successfully verified
YAGPDB.xyz
BOT
18-Oct-19 05:21 PM
Doug#6809<PHONE_NUMBER>81621515)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
18-Oct-19 10:59 PM
cryptofoolz#8414<PHONE_NUMBER>91619328)
New user joined waiting to be verified as a human
cryptofoolz#8414<PHONE_NUMBER>91619328)
User successfully verified
YAGPDB.xyz
BOT
19-Oct-19 01:44 AM
Williаm Ryаn#9542<PHONE_NUMBER>36766464)
New user joined waiting to be verified as a human
Williаm Ryаn#9542<PHONE_NUMBER>36766464)
User successfully verified
YAGPDB.xyz
BOT
19-Oct-19 02:41 AM
aakash#4173<PHONE_NUMBER>27397918)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
19-Oct-19 02:51 AM
aakash#4173<PHONE_NUMBER>27397918)
Kicked for not verifying within deadline
YAGPDB.xyz
BOT
19-Oct-19 04:55 AM
Matty4000#0910<PHONE_NUMBER>11388672)
New user joined waiting to be verified as a human
Matty4000#0910<PHONE_NUMBER>11388672)
User successfully verified
YAGPDB.xyz
BOT
19-Oct-19 07:34 AM
what is life#4318<PHONE_NUMBER>24043008)
New user joined waiting to be verified as a human
what is life#4318<PHONE_NUMBER>24043008)
New user joined waiting to be verified as a human
what is life#4318<PHONE_NUMBER>24043008)
User successfully verified
YAGPDB.xyz
BOT
19-Oct-19 05:49 PM
Mr.Lubo#2057<PHONE_NUMBER>68299970)
New user joined waiting to be verified as a human
Mr.Lubo#2057<PHONE_NUMBER>68299970)
User successfully verified
YAGPDB.xyz
BOT
19-Oct-19 11:31 PM
sajz#6900<PHONE_NUMBER>62752770)
New user joined waiting to be verified as a human
sajz#6900<PHONE_NUMBER>62752770)
User successfully verified
YAGPDB.xyz
BOT
20-Oct-19 12:05 AM
Jarren#7733<PHONE_NUMBER>12047873)
New user joined waiting to be verified as a human
Jarren#7733<PHONE_NUMBER>12047873)
User successfully verified
YAGPDB.xyz
BOT
20-Oct-19 01:46 AM
KS#8675<PHONE_NUMBER>14456064)
New user joined waiting to be verified as a human
CatsMayonnaise#0714<PHONE_NUMBER>51020080)
New user joined waiting to be verified as a human
CatsMayonnaise#0714<PHONE_NUMBER>51020080)
User successfully verified
YAGPDB.xyz
BOT
20-Oct-19 05:27 AM
Fruit Juice#6493<PHONE_NUMBER>89341204)
New user joined waiting to be verified as a human
Fruit Juice#6493<PHONE_NUMBER>89341204)
User successfully verified
YAGPDB.xyz
BOT
20-Oct-19 08:13 AM
Patator#7259<PHONE_NUMBER>59036675)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
20-Oct-19 08:23 AM
Patator#7259<PHONE_NUMBER>59036675)
Kicked for not verifying within deadline
YAGPDB.xyz
BOT
20-Oct-19 02:03 PM
Jkrush#0469<PHONE_NUMBER>25787650)
New user joined waiting to be verified as a human
donomads#5958<PHONE_NUMBER>13458975)
New user joined waiting to be verified as a human
donomads#5958<PHONE_NUMBER>13458975)
User successfully verified
Jkrush#0469<PHONE_NUMBER>25787650)
User successfully verified
YAGPDB.xyz
BOT
20-Oct-19 03:42 PM
pr3dat05#8932<PHONE_NUMBER>91298084)
New user joined waiting to be verified as a human
pr3dat05#8932<PHONE_NUMBER>91298084)
User successfully verified
YAGPDB.xyz
BOT
20-Oct-19 05:09 PM
mellymel#2013<PHONE_NUMBER>83166465)
New user joined waiting to be verified as a human
mellymel#2013<PHONE_NUMBER>83166465)
User successfully verified
YAGPDB.xyz
BOT
20-Oct-19 06:09 PM
CryptoLaw#2910<PHONE_NUMBER>17065984)
New user joined waiting to be verified as a human
CryptoLaw#2910<PHONE_NUMBER>17065984)
User successfully verified
YAGPDB.xyz
BOT
20-Oct-19 06:29 PM
not sure#4378<PHONE_NUMBER>05236736)
New user joined waiting to be verified as a human
Walter Menezes#1890<PHONE_NUMBER>75093250)
New user joined waiting to be verified as a human
Walter Menezes#1890<PHONE_NUMBER>75093250)
User successfully verified
not sure#4378<PHONE_NUMBER>05236736)
Kicked for not verifying within deadline
YAGPDB.xyz
BOT
21-Oct-19 12:38 AM
alexsandrk20#5430<PHONE_NUMBER>19580170)
New user joined waiting to be verified as a human
alexsandrk20#5430<PHONE_NUMBER>19580170)
User successfully verified
YAGPDB.xyz
BOT
21-Oct-19 10:18 AM
prince dharma#1287<PHONE_NUMBER>62321680)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
21-Oct-19 10:28 AM
prince dharma#1287<PHONE_NUMBER>62321680)
Kicked for not verifying within deadline
YAGPDB.xyz
BOT
21-Oct-19 07:16 PM
TonyLipsey#3998<PHONE_NUMBER>48020746)
New user joined waiting to be verified as a human
TonyLipsey#3998<PHONE_NUMBER>48020746)
User successfully verified
YAGPDB.xyz
BOT
21-Oct-19 08:12 PM
cryptoklein#5513<PHONE_NUMBER>46717717)
New user joined waiting to be verified as a human
cryptoklein#5513<PHONE_NUMBER>46717717)
User successfully verified
YAGPDB.xyz
BOT
21-Oct-19 08:40 PM
Crypto99#9487<PHONE_NUMBER>75255834)
New user joined waiting to be verified as a human
Crypto99#9487<PHONE_NUMBER>75255834)
User successfully verified
YAGPDB.xyz
BOT
21-Oct-19 10:24 PM
brytozee#5261<PHONE_NUMBER>57650226)
New user joined waiting to be verified as a human
brytozee#5261<PHONE_NUMBER>57650226)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
21-Oct-19 10:34 PM
brytozee#5261<PHONE_NUMBER>57650226)
Kicked for not verifying within deadline
YAGPDB.xyz
BOT
22-Oct-19 04:46 AM
TITANIUM#5913<PHONE_NUMBER>93507072)
New user joined waiting to be verified as a human
TITANIUM#5913<PHONE_NUMBER>93507072)
User successfully verified
YAGPDB.xyz
BOT
22-Oct-19 07:38 AM
supidfish#1803<PHONE_NUMBER>58857247)
New user joined waiting to be verified as a human
stupidfish#4221<PHONE_NUMBER>52643082)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
22-Oct-19 07:48 AM
supidfish#1803<PHONE_NUMBER>58857247)
Kicked for not verifying within deadline
stupidfish#4221<PHONE_NUMBER>52643082)
Kicked for not verifying within deadline
D_cLicK#3868<PHONE_NUMBER>48194325)
New user joined waiting to be verified as a human
D_cLicK#3868<PHONE_NUMBER>48194325)
New user joined waiting to be verified as a human
D_cLicK#3868<PHONE_NUMBER>48194325)
New user joined waiting to be verified as a human
D_cLicK#3868<PHONE_NUMBER>48194325)
New user joined waiting to be verified as a human
D-cLicK#1873<PHONE_NUMBER>34110721)
New user joined waiting to be verified as a human
YAGPDB.xyz
BOT
22-Oct-19 09:59 AM
kckhong#6647<PHONE_NUMBER>54669570)
New user joined waiting to be verified as a human
kckhong#6647<PHONE_NUMBER>54669570)
User successfully verified
YAGPDB.xyz
BOT
22-Oct-19 02:09 PM
阳江豪#7508<PHONE_NUMBER>55073802)
New user joined waiting to be verified as a human
hijack#8800<PHONE_NUMBER>00669953)
New user joined waiting to be verified as a human
hijack#8800<PHONE_NUMBER>00669953)
User successfully verified
阳江豪#7508<PHONE_NUMBER>55073802)
Kicked for not verifying within deadline
YAGPDB.xyz
BOT
22-Oct-19 03:12 PM
hijack#8800<PHONE_NUMBER>00669953)
New user joined waiting to be verified as a human
hijack#8800<PHONE_NUMBER>00669953)
User successfully verified
YAGPDB.xyz
BOT
22-Oct-19 03:30 PM
deniz075#6757<PHONE_NUMBER>25690880)
New user joined waiting to be verified as a human
deniz075#6757<PHONE_NUMBER>25690880)
User successfully verified


Document History
| Doc ID | Sender | Receiver | Subject | Details | Date of Receipt | Status | Comment |
|---|---|---|---|---|---|---|---|
| Doc ID | Sender | Receiver | Subject | Details | Date of Receipt | Status | Comment |
| {{ item }} | {% endfor %}
| Doc ID | Sender | Receiver | Subject | Details | Date of Receipt | Status | Comment |
|---|---|---|---|---|---|---|---|
| Doc ID | Sender | Receiver | Subject | Details | Date of Receipt | Status | Comment |
| {{ item }} | {% endfor %}


Below you will find an overview of my ongoing and past research projects, as well as a sample of my publications on each theme. A complete list of my published research can be found on the Publications page – including links to open-access copies of my articles – or via my CV.
Who Should Have a Say? Preferences for Differentiated Representation
Equal representation is at the core of representative democracy, but are citizens actually in favour of it? My research on this theme investigates when and why citizens believe that policy-affected individuals should have more or less influence than others. Funded by the EU’s H2020 Programme via a Marie Curie Individual Fellowship (Grant Number 750556), my publications on this topic include research on:
- Attitudes toward targeted representation, with a focus on police reform
- Reactions to different representational approaches, with a focus on tax reform
- The impact of public consultations on blame attribution
- Factors shaping the preferred influence of those who stand to gain or lose from legislation
Universalism and the Welfare State
How committed are citizens to universalism, redistribution, and the welfare state, and what factors shape their commitment? Beginning with my affiliation with the UNIWEL (Universalism and the Welfare State) project at Aarhus University, I have investigated various topics related to this theme. My published work on the topic has examined:
- The motives citizens ascribe to their pro- and anti-redistribution compatriots
- The effects of welfare state universalism on immigrant integration
- The implications of class identity for social policy preferences
- The attitudinal effects of the structure of inequality across the income spectrum
- The equality and welfare content of party manifestoes
- The use of targeted versus universalistic party appeals
Insiders and Outsiders
What factors shape relations between insiders and outsiders? Several of my studies explore the division between groups that have historically been protected by social policy and labour market regulations (i.e. insiders) and those we have excluded from that protection (i.e. outsiders). Some of the topics I have addressed with this research include:
- The drivers of social assistance reforms
- The relationship between care work, inequality, and job satisfaction
- The effect of labour market vulnerability on attitudes toward immigrants and asylum-seeking policy
- The impact of the insider/outsider divide on generalised trust
- The institutional and political determinants of coverage extension (book - open access copy)
If you’re interested in finding a proper e-version of my book and are affiliated with a university, you may be able to get access through JSTOR. Alternatively, you can buy a copy of the book from Amsterdam University Press or elsewhere.


pragma solidity 0.4.24;
import "./UpgradeabilityProxy.sol";
/**
* @title OwnedUpgradeabilityProxy
* @dev This contract combines an upgradeability proxy with basic authorization control functionalities
*/
contract OwnedUpgradeabilityProxy is UpgradeabilityProxy {
/**
* @dev Event to show ownership has been transferred
* @param previousOwner representing the address of the previous owner
* @param newOwner representing the address of the new owner
*/
event ProxyOwnershipTransferred(address previousOwner, address newOwner);
// Storage position of the owner of the contract
bytes32 private constant PROXY_OWNER_POSITION = keccak256("proxy.owner");
/**
* @dev the constructor sets the original owner of the contract to the sender account.
*/
constructor() public {
setUpgradeabilityOwner(msg.sender);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyProxyOwner() {
require(msg.sender == proxyOwner(), "ERROR_NOT_PROXY_OWNER");
_;
}
/**
* @dev Tells the address of the owner
* @return the address of the owner
*/
function proxyOwner() public view returns(address owner) {
bytes32 position = PROXY_OWNER_POSITION;
assembly {
owner := sload(position)
}
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferProxyOwnership(address newOwner) public onlyProxyOwner {
require(newOwner != address(0), "ERROR_INVALID_ADDRESS");
emit ProxyOwnershipTransferred(proxyOwner(), newOwner);
setUpgradeabilityOwner(newOwner);
}
/**
* @dev Allows the proxy owner to upgrade the current version of the proxy.
* @param implementation representing the address of the new implementation to be set.
*/
function upgradeTo(address implementation) public onlyProxyOwner {
_upgradeTo(implementation);
}
/**
* @dev Allows the proxy owner to upgrade the current version of the proxy and call the new implementation
* to initialize whatever is needed through a low level call.
* @param implementation representing the address of the new implementation to be set.
* @param data represents the msg.data to bet sent in the low level call. This parameter may include the function
* signature of the implementation to be called with the needed payload
*/
function upgradeToAndCall(address implementation, bytes data) public payable onlyProxyOwner {
upgradeTo(implementation);
require(address(this).call.value(msg.value)(data), "ERROR_UNSUCCESSFUL_CALL");
}
/**
* @dev Sets the address of the owner
*/
function setUpgradeabilityOwner(address newProxyOwner) internal {
bytes32 position = PROXY_OWNER_POSITION;
assembly {
sstore(position, newProxyOwner)
}
}
}
|


Westernacher as an integrated business and IT consulting firm has been a trusted service provider for its customers since 1969. Westernacher is organized into two divisions, each with a different focus: Consulting & Products/Services
As the market leader in enterprise application software, SAP is at the center of today’s business and technology revolution. Our innovations enable more than 293,500 customers worldwide to work together more efficiently and use business insight more effectively. SAP helps organizations of all sizes and industries overcome the complexities that plague our businesses, our jobs, and our lives. With Run Simple as our operating principle, SAP’s nearly 74,500 employees focus on a singular purpose that inspires us every day: To help the world run better and improve people’s lives.
领先的物流管理软件提供商，精益物流管理领域的领导者；集物流行业咨询、软件产品开发和服务为一体化；提供的不仅仅是软件产品本身，更注重分享十余年来、数百家客户项目积累的丰富经验。以专注、专业、专心的服务理念，成为2010上海世博物流中心WMS软件供应商，中国运载火箭物流中心战略合作伙伴
达美信息技术有限公司是中国领先的企业信息化专业服务提供商，始创于2004年，致力于为国内外企业提供世界领先的全方位企业信息化专业服务。目前，达美是中国通过SAP全球资格认证最多的专业咨询公司之一，作为中国最强的SAP新技术伙伴，SAP金牌战略合作伙伴，SAP亚太区顶尖合作伙伴计划成员，达美在市场份额、成功案例和顾问规模等方面均居中国本土第一，直接服务企业客户超过260家，在业内树立了IT服务、尤其是SAP专业服务的实力品牌。