Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
N
NP_TMcode
Manage
Activity
Members
Plan
Wiki
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container Registry
Analyze
Contributor analytics
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Giacomo Mulas
NP_TMcode
Commits
50a311fa
Commit
50a311fa
authored
1 year ago
by
Giovanni La Mura
Browse files
Options
Downloads
Patches
Plain Diff
Initiate sph work-flow migration to C++
parent
049e5c28
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/nptm.cpp
+23
-0
23 additions, 0 deletions
src/nptm.cpp
src/sphere.cpp
+279
-0
279 additions, 0 deletions
src/sphere.cpp
with
302 additions
and
0 deletions
src/nptm.cpp
0 → 100644
+
23
−
0
View file @
50a311fa
/*! \file nptm.cpp
*/
#include
<cstdio>
#include
<string>
#include
"include/Configuration.h"
using
namespace
std
;
extern
void
sphere
();
/*! \brief Main program entry point.
*
* This is the starting point of the execution flow. Here we may choose
* how to configure the code, e.g. by loading a legacy configuration file
* or some otherwise formatted configuration data set. The code can be
* linked to a luncher script or to a GUI oriented application that performs
* the configuration and runs the main program.
*/
int
main
(
int
argc
,
char
**
argv
)
{
sphere
();
return
0
;
}
This diff is collapsed.
Click to expand it.
src/sphere.cpp
0 → 100644
+
279
−
0
View file @
50a311fa
#include
<cstdio>
#include
<fstream>
#include
<string>
#include
<complex>
#include
"include/Configuration.h"
#include
"include/sph_subs.h"
using
namespace
std
;
//! \brief C++ implementation of SPH
void
sphere
()
{
//complex<double> dc0[5];
//complex<double> dc0m[2][4];
complex
<
double
>
arg
,
s0
,
tfsas
;
printf
(
"INFO: making legacy configuration ...
\n
"
);
ScattererConfiguration
*
conf
=
ScattererConfiguration
::
from_dedfb
(
"../../test_data/sphere/DEDFB"
);
conf
->
write_formatted
(
"c_OEDFB"
);
conf
->
write_binary
(
"c_TEDF"
);
delete
conf
;
printf
(
"INFO: reading binary configuration ...
\n
"
);
ScattererConfiguration
*
sconf
=
ScattererConfiguration
::
from_binary
(
"c_TEDF"
);
GeometryConfiguration
*
gconf
=
GeometryConfiguration
::
from_legacy
(
"../../test_data/sphere/DSPH"
);
if
(
sconf
->
number_of_spheres
==
gconf
->
number_of_spheres
)
{
int
nsph
=
gconf
->
number_of_spheres
;
C1
*
c1
=
new
C1
;
for
(
int
i
=
0
;
i
<
nsph
;
i
++
)
{
c1
->
iog
[
i
]
=
sconf
->
iog_vec
[
i
];
c1
->
nshl
[
i
]
=
sconf
->
nshl_vec
[
i
];
c1
->
ros
[
i
]
=
sconf
->
radii_of_spheres
[
i
];
}
for
(
int
i
=
0
;
i
<
gconf
->
l_max
;
i
++
)
{
c1
->
rmi
[
i
][
0
]
=
complex
<
double
>
(
0.0
,
0.0
);
c1
->
rmi
[
i
][
1
]
=
complex
<
double
>
(
0.0
,
0.0
);
c1
->
rei
[
i
][
0
]
=
complex
<
double
>
(
0.0
,
0.0
);
c1
->
rei
[
i
][
1
]
=
complex
<
double
>
(
0.0
,
0.0
);
}
C2
*
c2
=
new
C2
;
FILE
*
output
=
fopen
(
"c_OSPH"
,
"w"
);
fprintf
(
output
,
" READ(IR,*)NSPH,LM,INPOL,NPNT,NPNTTS,ISAM
\n
"
);
fprintf
(
output
,
" %5d%5d%5d%5d%5d%5d
\n
"
,
gconf
->
number_of_spheres
,
gconf
->
l_max
,
gconf
->
in_pol
,
gconf
->
npnt
,
gconf
->
npntts
,
gconf
->
meridional_type
);
fprintf
(
output
,
" READ(IR,*)TH,THSTP,THLST,THS,THSSTP,THSLST
\n
"
);
fprintf
(
output
,
" %9.3lE %9.3lE %9.3lE %9.3lE %9.3lE %9.3lE
\n
"
,
gconf
->
in_theta_start
,
gconf
->
in_theta_step
,
gconf
->
in_theta_end
,
gconf
->
sc_theta_start
,
gconf
->
sc_theta_step
,
gconf
->
sc_theta_end
);
fprintf
(
output
,
" READ(IR,*)PH,PHSTP,PHLST,PHS,PHSSTP,PHSLST
\n
"
);
fprintf
(
output
,
" %9.3lE %9.3lE %9.3lE %9.3lE %9.3lE %9.3lE
\n
"
,
gconf
->
in_phi_start
,
gconf
->
in_phi_step
,
gconf
->
in_phi_end
,
gconf
->
sc_phi_start
,
gconf
->
sc_phi_step
,
gconf
->
sc_phi_end
);
fprintf
(
output
,
" READ(IR,*)JWTM
\n
"
);
fprintf
(
output
,
" %5d
\n
"
,
gconf
->
jwtm
);
fprintf
(
output
,
" READ(ITIN)NSPHT
\n
"
);
fprintf
(
output
,
" READ(ITIN)(IOG(I),I=1,NSPH)
\n
"
);
fprintf
(
output
,
" READ(ITIN)EXDC,WP,XIP,IDFC,NXI
\n
"
);
fprintf
(
output
,
" READ(ITIN)(XIV(I),I=1,NXI)
\n
"
);
fprintf
(
output
,
" READ(ITIN)NSHL(I),ROS(I)
\n
"
);
fprintf
(
output
,
" READ(ITIN)(RCF(I,NS),NS=1,NSH)
\n
\n
"
);
double
sml
=
1.0e-3
;
int
nth
=
0
,
nph
=
0
;
if
(
gconf
->
in_theta_step
!=
0.0
)
nth
=
int
((
gconf
->
in_theta_end
-
gconf
->
in_theta_start
)
/
gconf
->
in_theta_step
+
sml
);
nth
+=
1
;
if
(
gconf
->
in_phi_step
!=
0.0
)
nph
=
int
((
gconf
->
in_phi_end
-
gconf
->
in_phi_start
)
/
gconf
->
in_phi_step
+
sml
);
nph
+=
1
;
int
nths
=
0
,
nphs
=
0
;
double
thsca
;
if
(
gconf
->
meridional_type
>
1
)
{
// ISAM > 1, fixed scattering angle
nths
=
1
;
thsca
=
gconf
->
sc_theta_start
-
gconf
->
in_theta_start
;
}
else
{
//ISAM <= 1
if
(
gconf
->
in_theta_step
!=
0.0
)
nths
=
int
((
gconf
->
sc_theta_end
-
gconf
->
sc_theta_start
)
/
gconf
->
sc_theta_step
+
sml
);
nths
+=
1
;
if
(
gconf
->
meridional_type
==
1
)
{
// ISAM = 1
nphs
=
1
;
}
else
{
// ISAM < 1
if
(
gconf
->
sc_phi_step
!=
0.0
)
nphs
=
int
((
gconf
->
sc_phi_end
-
gconf
->
sc_phi_start
)
/
gconf
->
sc_phi_step
+
sml
);
nphs
+=
1
;
}
}
int
nk
=
nth
*
nph
;
int
nks
=
nths
*
nphs
;
int
nkks
=
nk
*
nks
;
int
th1
=
gconf
->
in_theta_start
;
int
ph1
=
gconf
->
in_phi_start
;
int
ths1
=
gconf
->
sc_theta_start
;
int
phs1
=
gconf
->
sc_phi_start
;
const
double
half_pi
=
acos
(
0.0
);
const
double
pi
=
2.0
*
half_pi
;
double
gcs
=
0.0
;
for
(
int
i116
=
1
;
i116
<=
nsph
;
i116
++
)
{
int
iogi
=
c1
->
iog
[
i116
-
1
];
if
(
iogi
>=
i116
)
{
double
gcss
=
pi
*
c1
->
ros
[
i116
-
1
]
*
c1
->
ros
[
i116
-
1
];
c1
->
gcsv
[
i116
-
1
]
=
gcss
;
int
nsh
=
c1
->
nshl
[
i116
-
1
];
for
(
int
j115
=
1
;
j115
<=
nsh
;
j115
++
)
{
c1
->
rc
[
i116
-
1
][
j115
-
1
]
=
sconf
->
rcf
[
i116
-
1
][
j115
-
1
]
*
c1
->
ros
[
i116
-
1
];
}
}
gcs
+=
c1
->
gcsv
[
iogi
-
1
];
}
double
****
zpv
=
new
double
***
[
gconf
->
l_max
];
//[gconf->l_max][3][2][2]; // Matrix: dim[LM x 3 x 2 x 2]
for
(
int
zi
=
0
;
zi
<
gconf
->
l_max
;
zi
++
)
{
zpv
[
zi
]
=
new
double
**
[
3
];
for
(
int
zj
=
0
;
zj
<
3
;
zj
++
)
{
zpv
[
zi
][
zj
]
=
new
double
*
[
2
];
for
(
int
zk
=
0
;
zk
<
2
;
zk
++
)
{
zpv
[
zi
][
zj
][
zk
]
=
new
double
[
2
];
}
}
}
thdps
(
gconf
->
l_max
,
zpv
);
//DEBUG CODE
/*
for (int zi = 0; zi < gconf->l_max; zi++) {
for (int zj = 0; zj < 3; zj++) {
for (int zk = 0; zk < 2; zk++) {
if (zpv[zi][zj][zk][0] != 0.0)
printf(
"DEBUG: zpv[%d][%d][%d][0] = %.3lE\n",
zi, zj, zk, zpv[zi][zj][zk][0]
);
if (zpv[zi][zj][zk][1] != 0.0)
printf(
"DEBUG: zpv[%d][%d][%d][1] = %.3lE\n",
zi, zj, zk, zpv[zi][zj][zk][1]
);
}
}
}
*/
//END OF DEBUG CODE
double
exri
=
sqrt
(
sconf
->
exdc
);
fprintf
(
output
,
" REFR. INDEX OF EXTERNAL MEDIUM=%15.7lE
\n
"
,
exri
);
fstream
tppoan
;
tppoan
.
open
(
"c_TPPOAN"
,
ios
::
binary
|
ios
::
out
);
if
(
tppoan
.
is_open
())
{
int
imode
=
10
;
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
imode
),
sizeof
(
int
));
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
(
gconf
->
meridional_type
)),
sizeof
(
int
));
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
(
gconf
->
in_pol
)),
sizeof
(
int
));
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
(
sconf
->
number_of_scales
)),
sizeof
(
int
));
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
nth
),
sizeof
(
int
));
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
nph
),
sizeof
(
int
));
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
nths
),
sizeof
(
int
));
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
nphs
),
sizeof
(
int
));
for
(
int
nsi
=
0
;
nsi
<
nsph
;
nsi
++
)
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
(
sconf
->
iog_vec
[
nsi
])),
sizeof
(
int
));
if
(
gconf
->
in_pol
==
0
)
fprintf
(
output
,
" LIN
\n
"
);
else
fprintf
(
output
,
" CIRC
\n
"
);
fprintf
(
output
,
"
\n
"
);
double
wn
=
sconf
->
wp
/
3.0e8
;
double
sqsfi
=
1.0
;
double
vk
,
vkarg
;
if
(
sconf
->
idfc
<
0
)
{
vk
=
sconf
->
xip
*
wn
;
fprintf
(
output
,
" VK=%15.7lE, XI IS SCALE FACTOR FOR LENGTHS
\n
"
,
vk
);
fprintf
(
output
,
"
\n
"
);
}
for
(
int
jxi488
=
1
;
jxi488
<=
sconf
->
number_of_scales
;
jxi488
++
)
{
fprintf
(
output
,
"========== JXI =%3d ====================
\n
"
,
jxi488
);
double
xi
=
sconf
->
scale_vec
[
jxi488
-
1
];
if
(
sconf
->
idfc
>=
0
)
{
vk
=
xi
*
wn
;
vkarg
=
vk
;
fprintf
(
output
,
" VK=%15.7lE, XI=%15.7lE
\n
"
,
xi
,
vk
);
}
else
{
// IDFC < 0
vkarg
=
xi
*
vk
;
sqsfi
=
1.0
/
(
xi
*
xi
);
fprintf
(
output
,
" XI=%15.7lE
\n
"
,
xi
);
}
tppoan
.
write
(
reinterpret_cast
<
char
*>
(
&
vk
),
sizeof
(
double
));
for
(
int
i132
=
1
;
i132
<=
nsph
;
i132
++
)
{
int
iogi
=
sconf
->
iog_vec
[
i132
-
1
];
if
(
iogi
!=
i132
)
{
for
(
int
l123
=
1
;
l123
<=
gconf
->
l_max
;
l123
++
)
{
// QUESTION: aren't RMI and REI still empty?
c1
->
rmi
[
l123
-
1
][
i132
-
1
]
=
c1
->
rmi
[
l123
-
1
][
iogi
-
1
];
c1
->
rei
[
l123
-
1
][
i132
-
1
]
=
c1
->
rei
[
l123
-
1
][
iogi
-
1
];
}
continue
;
// i132
}
int
nsh
=
sconf
->
nshl_vec
[
i132
-
1
];
int
ici
=
(
nsh
+
1
)
/
2
;
if
(
sconf
->
idfc
==
0
)
{
for
(
int
ic
=
0
;
ic
<
ici
;
ic
++
)
c2
->
dc0
[
ic
]
=
sconf
->
dc0_matrix
[
ic
][
i132
-
1
][
0
];
// WARNING: IDFC=0 is not tested!
}
else
{
// IDFC != 0
if
(
jxi488
==
1
)
{
for
(
int
ic
=
0
;
ic
<
ici
;
ic
++
)
{
c2
->
dc0
[
ic
]
=
sconf
->
dc0_matrix
[
ic
][
i132
-
1
][
jxi488
-
1
];
}
}
}
if
(
nsh
%
2
==
0
)
c2
->
dc0
[
ici
]
=
sconf
->
exdc
;
int
jer
=
0
;
int
lcalc
=
0
;
dme
(
gconf
->
l_max
,
i132
,
gconf
->
npnt
,
gconf
->
npntts
,
vkarg
,
sconf
->
exdc
,
exri
,
c1
,
c2
,
jer
,
lcalc
,
arg
);
if
(
jer
!=
0
)
{
fprintf
(
output
,
" STOP IN DME
\n
"
);
fprintf
(
output
,
" AT %1d LCALC=%3d TOO SMALL WITH ARG=%15.7lE+i(%15.7lE)
\n
"
,
jer
,
lcalc
,
arg
.
real
(),
arg
.
imag
());
tppoan
.
close
();
fclose
(
output
);
return
;
}
}
// i132
if
(
sconf
->
idfc
>=
0
and
nsph
==
1
and
jxi488
==
gconf
->
jwtm
)
{
// This is the condition that writes the transition matrix to output.
int
is
=
1111
;
fstream
ttms
;
ttms
.
open
(
"c_TTMS"
,
ios
::
binary
|
ios
::
out
);
if
(
ttms
.
is_open
())
{
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
is
),
sizeof
(
int
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
(
gconf
->
l_max
)),
sizeof
(
int
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
vk
),
sizeof
(
double
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
exri
),
sizeof
(
double
));
for
(
int
lmi
=
0
;
lmi
<
gconf
->
l_max
;
lmi
++
)
{
complex
<
double
>
element1
=
-
1.0
/
c1
->
rmi
[
0
][
lmi
];
complex
<
double
>
element2
=
-
1.0
/
c1
->
rei
[
0
][
lmi
];
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
element1
),
sizeof
(
complex
<
double
>
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
element2
),
sizeof
(
complex
<
double
>
));
}
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
(
sconf
->
radii_of_spheres
[
0
])),
sizeof
(
double
));
ttms
.
close
();
}
else
{
// Failed to open output file. Should never happen.
printf
(
"ERROR: could not open TTMS file.
\n
"
);
tppoan
.
close
();
fclose
(
output
);
}
}
// We are at line 271 of SPH.f
double
cs0
=
0.25
*
vk
*
vk
*
vk
/
half_pi
;
sscr0
(
tfsas
,
nsph
,
gconf
->
l_max
,
vk
,
exri
,
c1
);
printf
(
"DEBUG: TFSAS = (%lE,%lE)
\n
"
,
tfsas
.
real
(),
tfsas
.
imag
());
}
//jxi488
tppoan
.
close
();
}
else
{
// In case TPPOAN could not be opened. Should never happen.
printf
(
"ERROR: failed to open TPPOAN file.
\n
"
);
}
fclose
(
output
);
}
else
{
// NSPH mismatch between geometry and scatterer configurations.
throw
UnrecognizedConfigurationException
(
"Inconsistent geometry and scatterer configurations."
);
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment