Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F96585604
criticinv.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Dec 28, 14:08
Size
7 KB
Mime Type
text/x-c
Expires
Mon, Dec 30, 14:08 (2 d)
Engine
blob
Format
Raw Data
Handle
23212536
Attached To
R1448 Lenstool-HPC
criticinv.c
View Options
#include<stdio.h>
#include<math.h>
#include<fonction.h>
#include<constant.h>
#include<dimension.h>
#include<structure.h>
/****************************************************************/
/* nom: critic */
/* auteur: Jean-Paul Kneib */
/* date: 10/02/92 */
/* place: Toulouse */
/****************************************************************/
/* Parameters
* xmin, ymin, xmax, ymax define the size of the working image
*
* Global variables used :
* - CL, radial, tangent, lens, nrline, ntline, flagr, flagt, G
* - in e_zeroamp() : G, lens
* - in next() : G, lens
* - in e_dpl() : G, lens, lens_table
* - in dratio() : C
* - in chsigne() : G, lens
* - in follow() : CL, radial, nrline, flagr, G, lens, lens_table
* - in followi() : CL, ntline, flagt, tangent, G, lens, lens_table
* */
#undef NPOINT
#define NPOINT 4
void
criticinv
(
double
xmin
,
double
ymin
,
double
xmax
,
double
ymax
)
{
const
extern
struct
g_cline
CL
;
extern
struct
biline
radial
[],
tangent
[];
const
extern
struct
pot
lens
[];
const
extern
struct
g_grille
G
;
extern
int
nrline
,
ntline
,
flagr
,
flagt
;
struct
point
A
,
B
,
DPL
,
N
,
O
,
OI
,
OS
,
P
,
Q
;
struct
point
LP
[
NLMAX
+
1
];
/*path from the bottom left hand corner to the
farthest lens*/
struct
point
LDPL
[
NLMAX
+
1
];
/*distance in units of ppas in x and y directions
between 2 consecutive lenses*/
int
lnpas
[
NLMAX
+
1
];
int
nu
[
NLMAX
+
1
];
/*contains the lens order on the LP path*/
int
fsel
[
NLMAX
+
1
];
/*keep in memory that nu[i] lens has been considered
in the LP path*/
double
ppas
;
/* sampling size.(Diag/NPOINT)*/
double
dc
;
double
Dmin
;
double
J
;
double
dl0s
,
dos
,
dlsds
;
// distances between lens[0] and CL.nz[i], and ratio
register
int
j
,
k
,
ii
;
register
int
i
;
int
signe_flag
;
/* initialisation de quelques constantes */
nrline
=
0
;
flagr
=
1
;
ntline
=
0
;
flagt
=
1
;
J
=
NPOINT
;
ppas
=
sqrt
((
xmax
-
xmin
)
*
(
xmax
-
xmin
)
+
(
ymax
-
ymin
)
*
(
ymax
-
ymin
))
/
NPOINT
;
/* liste des points a suivre */
/* if only 1 lens*/
if
(
G
.
nlens
==
1
)
{
LP
[
0
]
=
lens
[
0
].
C
;
LDPL
[
0
].
x
=
Max
(
xmax
-
lens
[
0
].
C
.
x
,
xmin
-
lens
[
0
].
C
.
x
)
/
J
;
LDPL
[
0
].
y
=
Max
(
ymax
-
lens
[
0
].
C
.
y
,
ymin
-
lens
[
0
].
C
.
y
)
/
J
;
if
((
lens
[
0
].
type
==
5
)
||
(
lens
[
0
].
type
==
7
)
||
(
lens
[
0
].
type
==
0
)
||
(
lens
[
0
].
type
==
1
))
{
LP
[
0
].
x
+=
LDPL
[
0
].
x
;
LP
[
0
].
y
+=
LDPL
[
0
].
y
;
};
lnpas
[
0
]
=
NPOINT
;
}
/*end of if only 1 lens*/
else
{
LP
[
0
].
x
=
xmin
;
/*LP is the path from the bottom left hand corner to the farthest lens*/
LP
[
0
].
y
=
ymin
;
Dmin
=
9999.
;
for
(
i
=
0
;
i
<
G
.
nlens
;
i
++
)
{
nu
[
i
]
=
99
;
fsel
[
i
]
=
0
;
};
/* look for the closest lens from the bottom left hand corner*/
for
(
i
=
0
;
i
<
G
.
nlens
;
i
++
)
{
dc
=
dist
(
LP
[
0
],
lens
[
i
].
C
);
if
(
dc
<
Dmin
)
{
Dmin
=
dc
;
/* Dmin contains the minimum distance from the corner*/
nu
[
0
]
=
i
;
/* nu[0] contains the index for the 1st closest lens*/
};
};
LP
[
1
]
=
lens
[
nu
[
0
]].
C
;
fsel
[
nu
[
0
]]
=
1
;
/*for each lens*/
for
(
i
=
1
;
i
<
G
.
nlens
;
i
++
)
{
Dmin
=
9999.
;
/*find the closest lens from the LP[i] point*/
for
(
j
=
0
;
j
<
G
.
nlens
;
j
++
)
{
if
(
fsel
[
j
]
!=
1
)
{
dc
=
dist
(
LP
[
i
],
lens
[
j
].
C
);
if
(
dc
<
Dmin
)
{
Dmin
=
dc
;
nu
[
i
]
=
j
;
/*keep the lens order on the LP path*/
};
};
};
LP
[
i
+
1
]
=
lens
[
nu
[
i
]].
C
;
fsel
[
nu
[
i
]]
=
1
;
/*keep in memory that nu[i] lens has been considered in the LP path*/
};
/*end of for each lens*/
/*for each lens*/
for
(
i
=
0
;
i
<
G
.
nlens
;
i
++
)
{
if
((
lens
[
nu
[
i
]].
type
==
5
)
||
(
lens
[
nu
[
i
]].
type
==
7
)
||
(
lens
[
nu
[
i
]].
type
==
0
)
||
(
lens
[
nu
[
i
]].
type
==
1
))
{
LP
[
i
+
1
].
x
+=
0.01
;
LP
[
i
+
1
].
y
+=
0.015
;
};
/*number of ppas in x and y between 2 consecutive lenses*/
lnpas
[
i
]
=
(
int
)
(
dist
(
LP
[
i
],
LP
[
i
+
1
])
/
2.
/
ppas
);
LDPL
[
i
].
x
=
(
LP
[
i
+
1
].
x
-
LP
[
i
].
x
)
/
lnpas
[
i
];
LDPL
[
i
].
y
=
(
LP
[
i
+
1
].
y
-
LP
[
i
].
y
)
/
lnpas
[
i
];
};
};
/*end of there are more than 1 lens*/
/*for each critical line to draw*/
for
(
k
=
0
;
k
<
CL
.
nplan
;
k
++
)
{
dl0s
=
distcosmo2
(
lens
[
0
].
z
,
CL
.
cz
[
k
]);
dos
=
distcosmo1
(
CL
.
cz
[
k
]);
dlsds
=
dl0s
/
dos
;
/*for each lens*/
for
(
ii
=
0
;
ii
<
G
.
nlens
;
ii
++
)
{
A
=
LP
[
ii
];
DPL
=
LDPL
[
ii
];
/*for each point along the path*/
for
(
i
=
1
;
i
<
lnpas
[
ii
];
A
=
B
,
i
++
)
{
B
.
x
=
A
.
x
+
DPL
.
x
;
B
.
y
=
A
.
y
+
DPL
.
y
;
signe_flag
=
chsigne
(
A
,
B
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
if
(
signe_flag
==
1
)
/*search for the radial critical line*/
{
radial
[
nrline
].
i
=
flagr
;
OI
=
O
=
radial
[
nrline
].
I
=
e_zeroamp
(
A
,
B
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
e_dpl
(
&
O
,
dlsds
,
&
OI
);
radial
[
nrline
++
].
S
=
OI
;
N
.
x
=
O
.
x
-
DPL
.
y
/
2.
;
N
.
y
=
O
.
y
+
DPL
.
x
/
2.
;
radial
[
nrline
].
i
=
flagr
;
P
=
radial
[
nrline
].
I
=
next
(
N
,
O
,
CL
.
cpas
/
2.
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
e_dpl
(
&
P
,
dlsds
,
&
radial
[
nrline
++
].
S
);
radial
[
nrline
].
i
=
flagr
;
Q
=
radial
[
nrline
].
I
=
next
(
O
,
P
,
CL
.
cpas
/
2.
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
e_dpl
(
&
Q
,
dlsds
,
&
radial
[
nrline
++
].
S
);
follow
(
P
,
Q
,
O
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
radial
[
nrline
].
i
=
flagr
;
radial
[
nrline
].
I
=
OI
;
radial
[
nrline
++
].
S
=
OS
;
flagr
++
;
}
/*end of if (signe_flag==1)*/
else
if
(
signe_flag
==
2
)
{
tangent
[
ntline
].
i
=
flagt
;
OI
=
O
=
tangent
[
ntline
].
I
=
e_zeroamp
(
A
,
B
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
e_dpl
(
&
O
,
dlsds
,
&
OS
);
tangent
[
ntline
++
].
S
=
OS
;
N
.
x
=
O
.
x
-
DPL
.
y
/
2.
;
N
.
y
=
O
.
y
+
DPL
.
x
/
2.
;
tangent
[
ntline
].
i
=
flagt
;
P
=
tangent
[
ntline
].
I
=
next
(
N
,
O
,
CL
.
cpas
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
e_dpl
(
&
P
,
dlsds
,
&
tangent
[
ntline
++
].
S
);
tangent
[
ntline
].
i
=
flagt
;
Q
=
tangent
[
ntline
].
I
=
next
(
O
,
P
,
CL
.
cpas
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
e_dpl
(
&
Q
,
dlsds
,
&
tangent
[
ntline
++
].
S
);
followi
(
P
,
Q
,
O
,
dl0s
,
dos
,
CL
.
cz
[
k
]);
tangent
[
ntline
].
i
=
flagt
;
tangent
[
ntline
].
I
=
OI
;
tangent
[
ntline
++
].
S
=
OS
;
flagt
++
;
};
/*end of if (signe_flag==2) */
};
/*end of for(i=1;i<lnpas[ii];A=B,i++)*/
};
/*end of for(ii=0;ii<G.nlens;ii++)*/
};
/*end of for(k=0;k<CL.nplan;k++)*/
}
Event Timeline
Log In to Comment