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
281e5c6c
Commit
281e5c6c
authored
11 months ago
by
Giovanni La Mura
Browse files
Options
Downloads
Patches
Plain Diff
Implement static output for single sphere TM
parent
51346c1f
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/include/TransitionMatrix.h
+73
-4
73 additions, 4 deletions
src/include/TransitionMatrix.h
src/libnptm/TransitionMatrix.cpp
+105
-6
105 additions, 6 deletions
src/libnptm/TransitionMatrix.cpp
with
178 additions
and
10 deletions
src/include/TransitionMatrix.h
+
73
−
4
View file @
281e5c6c
...
...
@@ -60,8 +60,8 @@ class TransitionMatrix {
*
* This function takes care of the specific task of writing the transition
* matrix memory data structure to a binary output file formatted according
* to the HDF5 standard
. It is designed to work for the case of clusters of
* spheres.
* to the HDF5 standard
without a pre-existing instance. It is designed to
*
work for the case of a cluster of
spheres.
*
* \param file_name: `string` Name of the binary configuration data file.
* \param _nlemt: `np_int` Size of the matrix (2 * LE * (LE + 2)).
...
...
@@ -75,13 +75,33 @@ class TransitionMatrix {
double
_exri
,
dcomplex
**
_am0m
);
/*! \brief Write transition matrix data to HDF5 binary output.
*
* This function takes care of the specific task of writing the transition
* matrix memory data structure to a binary output file formatted according
* to the HDF5 standard without a pre-existing instance. It is designed to
* work for the case of a single sphere.
*
* \param file_name: `string` Name of the binary configuration data file.
* \param _lm: `int` Maximum field expansion order.
* \param _vk: `double` Wave number in scale units.
* \param _exri: `double` External medium refractive index.
* \param _rmi: `complex double **`
* \param _rei: `complex double **`
* \param _sphere_radius: `double` Radius of the sphere.
*/
static
void
write_hdf5
(
std
::
string
file_name
,
int
_lm
,
double
_vk
,
double
_exri
,
dcomplex
**
_rmi
,
dcomplex
**
_rei
,
double
_sphere_radius
);
/*! \brief Write the Transition Matrix to legacy binary output.
*
* \param file_name: `string` Name of the binary configuration data file.
*/
void
write_legacy
(
std
::
string
file_name
);
/*! \brief Write transition matrix data to
HDF5
binary output.
/*! \brief Write transition matrix data to binary output
using legacy format
.
*
* This function takes care of the specific task of writing the transition
* matrix memory data structure to a binary output file formatted according
...
...
@@ -100,6 +120,26 @@ class TransitionMatrix {
double
_exri
,
dcomplex
**
_am0m
);
/*! \brief Write transition matrix data to binary output using legacy format.
*
* This function takes care of the specific task of writing the transition
* matrix memory data structure to a binary output file formatted according
* to the original code structure without a pre-existing instance. It is designed
* to work for the case of a single sphere.
*
* \param file_name: `string` Name of the binary configuration data file.
* \param _lm: `int` Maximum field expansion order.
* \param _vk: `double` Wave number in scale units.
* \param _exri: `double` External medium refractive index.
* \param _rmi: `complex double **`
* \param _rei: `complex double **`
* \param _sphere_radius: `double` Radius of the sphere.
*/
static
void
write_legacy
(
std
::
string
file_name
,
int
_lm
,
double
_vk
,
double
_exri
,
dcomplex
**
_rmi
,
dcomplex
**
_rei
,
double
_sphere_radius
);
public:
/*! \brief Default Transition Matrix instance constructor.
*
...
...
@@ -181,7 +221,7 @@ class TransitionMatrix {
*/
void
write_binary
(
std
::
string
file_name
,
std
::
string
mode
=
"LEGACY"
);
/*! \brief Write a Transition Matrix to a binary file without instanciating it.
/*! \brief Write a
cluster
Transition Matrix to a binary file without instanciating it.
*
* Transition Matrix data can take a large amount of memory. For such reason, attempts
* to create TransitionMatrix instances only for writing purposes can create
...
...
@@ -208,6 +248,35 @@ class TransitionMatrix {
double
_exri
,
dcomplex
**
_am0m
,
std
::
string
mode
=
"LEGACY"
);
/*! \brief Write a single sphere Transition Matrix to a binary file without instanciating it.
*
* Transition Matrix data can take a large amount of memory. For such reason, attempts
* to create TransitionMatrix instances only for writing purposes can create
* unnecessary resource consumption and computing time to duplicate the data into
* the output buffer. This function offers output to file as a static method. It
* takes the arguments of a constructor together with the usual arguments to specify
* the output file name and format, to write the required data directly to a file,
* without creating a new TransitionMatrix instance. The implementation works for
* TransitionMatrix objects built for the single sphere case. It belongs to the public
* class interface and it calls the proper versions of `write_legacy()` and `write_hdf5()`,
* depending on the requested output format.
*
* \param file_name: `string` Name of the file to be written.
* \param _lm: `int` Maximum field expansion order.
* \param _vk: `double` Wave number in scale units.
* \param _exri: `double` External medium refractive index.
* \param _rmi: `complex double **`
* \param _rei: `complex double **`
* \param _sphere_radius: `double` Radius of the sphere.
* \param mode: `string` Binary encoding. Can be one of ["LEGACY", "HDF5"] . Optional
* (default is "LEGACY").
*/
static
void
write_binary
(
std
::
string
file_name
,
int
_lm
,
double
_vk
,
double
_exri
,
dcomplex
**
_rmi
,
dcomplex
**
_rei
,
double
_sphere_radius
,
std
::
string
mode
=
"LEGACY"
);
/*! \brief Test whether two instances of TransitionMatrix are equal.
*
* Transition matrices can be the result of a calculation or of a file input operation,
...
...
This diff is collapsed.
Click to expand it.
src/libnptm/TransitionMatrix.cpp
+
105
−
6
View file @
281e5c6c
...
...
@@ -94,7 +94,7 @@ TransitionMatrix::TransitionMatrix(
}
}
TransitionMatrix
*
TransitionMatrix
::
from_binary
(
string
file_name
,
string
mode
)
{
TransitionMatrix
*
TransitionMatrix
::
from_binary
(
std
::
string
file_name
,
std
::
string
mode
)
{
TransitionMatrix
*
tm
=
NULL
;
if
(
mode
.
compare
(
"LEGACY"
)
==
0
)
{
tm
=
TransitionMatrix
::
from_legacy
(
file_name
);
...
...
@@ -107,7 +107,7 @@ TransitionMatrix* TransitionMatrix::from_binary(string file_name, string mode) {
return
tm
;
}
TransitionMatrix
*
TransitionMatrix
::
from_hdf5
(
string
file_name
)
{
TransitionMatrix
*
TransitionMatrix
::
from_hdf5
(
std
::
string
file_name
)
{
TransitionMatrix
*
tm
=
NULL
;
unsigned
int
flags
=
H5F_ACC_RDONLY
;
HDFFile
*
hdf_file
=
new
HDFFile
(
file_name
,
flags
);
...
...
@@ -160,7 +160,7 @@ TransitionMatrix* TransitionMatrix::from_hdf5(string file_name) {
return
tm
;
}
TransitionMatrix
*
TransitionMatrix
::
from_legacy
(
string
file_name
)
{
TransitionMatrix
*
TransitionMatrix
::
from_legacy
(
std
::
string
file_name
)
{
fstream
ttms
;
TransitionMatrix
*
tm
=
NULL
;
ttms
.
open
(
file_name
,
ios
::
binary
|
ios
::
in
);
...
...
@@ -207,7 +207,7 @@ TransitionMatrix* TransitionMatrix::from_legacy(string file_name) {
return
tm
;
}
void
TransitionMatrix
::
write_binary
(
string
file_name
,
string
mode
)
{
void
TransitionMatrix
::
write_binary
(
std
::
string
file_name
,
std
::
string
mode
)
{
if
(
mode
.
compare
(
"LEGACY"
)
==
0
)
{
write_legacy
(
file_name
);
}
else
if
(
mode
.
compare
(
"HDF5"
)
==
0
)
{
...
...
@@ -232,7 +232,22 @@ void TransitionMatrix::write_binary(
}
}
void
TransitionMatrix
::
write_hdf5
(
string
file_name
)
{
void
TransitionMatrix
::
write_binary
(
std
::
string
file_name
,
int
_lm
,
double
_vk
,
double
_exri
,
dcomplex
**
_rmi
,
dcomplex
**
_rei
,
double
_sphere_radius
,
std
::
string
mode
)
{
if
(
mode
.
compare
(
"LEGACY"
)
==
0
)
{
write_legacy
(
file_name
,
_lm
,
_vk
,
_exri
,
_rmi
,
_rei
,
_sphere_radius
);
}
else
if
(
mode
.
compare
(
"HDF5"
)
==
0
)
{
write_hdf5
(
file_name
,
_lm
,
_vk
,
_exri
,
_rmi
,
_rei
,
_sphere_radius
);
}
else
{
string
message
=
"Unknown format mode:
\"
"
+
mode
+
"
\"
"
;
throw
UnrecognizedFormatException
(
message
);
}
}
void
TransitionMatrix
::
write_hdf5
(
std
::
string
file_name
)
{
if
(
is
==
1
||
is
==
1111
)
{
List
<
string
>
rec_name_list
(
1
);
List
<
string
>
rec_type_list
(
1
);
...
...
@@ -328,7 +343,58 @@ void TransitionMatrix::write_hdf5(
delete
hdf_file
;
}
void
TransitionMatrix
::
write_legacy
(
string
file_name
)
{
void
TransitionMatrix
::
write_hdf5
(
std
::
string
file_name
,
int
_lm
,
double
_vk
,
double
_exri
,
dcomplex
**
_rmi
,
dcomplex
**
_rei
,
double
_sphere_radius
)
{
int
is
=
1111
;
List
<
string
>
rec_name_list
(
1
);
List
<
string
>
rec_type_list
(
1
);
List
<
void
*>
rec_ptr_list
(
1
);
string
str_type
,
str_name
;
rec_name_list
.
set
(
0
,
"IS"
);
rec_type_list
.
set
(
0
,
"INT32_(1)"
);
rec_ptr_list
.
set
(
0
,
&
is
);
rec_name_list
.
append
(
"L_MAX"
);
rec_type_list
.
append
(
"INT32_(1)"
);
rec_ptr_list
.
append
(
&
_lm
);
rec_name_list
.
append
(
"VK"
);
rec_type_list
.
append
(
"FLOAT64_(1)"
);
rec_ptr_list
.
append
(
&
_vk
);
rec_name_list
.
append
(
"EXRI"
);
rec_type_list
.
append
(
"FLOAT64_(1)"
);
rec_ptr_list
.
append
(
&
_exri
);
dcomplex
*
_elements
=
new
dcomplex
[
2
*
_lm
]();
for
(
int
ei
=
0
;
ei
<
_lm
;
ei
++
)
{
_elements
[
2
*
ei
]
=
-
1.0
/
_rmi
[
ei
][
0
];
_elements
[
2
*
ei
+
1
]
=
-
1.0
/
_rei
[
ei
][
0
];
}
rec_name_list
.
append
(
"ELEMENTS"
);
str_type
=
"COMPLEX128_("
+
to_string
(
_lm
)
+
","
+
to_string
(
2
)
+
")"
;
rec_type_list
.
append
(
str_type
);
rec_ptr_list
.
append
(
_elements
);
rec_name_list
.
append
(
"RADIUS"
);
rec_type_list
.
append
(
"FLOAT64_(1)"
);
rec_ptr_list
.
append
(
&
_sphere_radius
);
string
*
rec_names
=
rec_name_list
.
to_array
();
string
*
rec_types
=
rec_type_list
.
to_array
();
void
**
rec_pointers
=
rec_ptr_list
.
to_array
();
const
int
rec_num
=
rec_name_list
.
length
();
FileSchema
schema
(
rec_num
,
rec_types
,
rec_names
);
HDFFile
*
hdf_file
=
HDFFile
::
from_schema
(
schema
,
file_name
,
H5F_ACC_TRUNC
);
for
(
int
ri
=
0
;
ri
<
rec_num
;
ri
++
)
hdf_file
->
write
(
rec_names
[
ri
],
rec_types
[
ri
],
rec_pointers
[
ri
]);
hdf_file
->
close
();
delete
[]
_elements
;
delete
[]
rec_names
;
delete
[]
rec_types
;
delete
[]
rec_pointers
;
delete
hdf_file
;
}
void
TransitionMatrix
::
write_legacy
(
std
::
string
file_name
)
{
fstream
ttms
;
if
(
is
==
1111
||
is
==
1
)
{
ttms
.
open
(
file_name
,
ios
::
binary
|
ios
::
out
);
...
...
@@ -388,6 +454,39 @@ void TransitionMatrix::write_legacy(
}
}
void
TransitionMatrix
::
write_legacy
(
std
::
string
file_name
,
int
_lm
,
double
_vk
,
double
_exri
,
dcomplex
**
_rmi
,
dcomplex
**
_rei
,
double
_sphere_radius
)
{
fstream
ttms
;
int
is
=
1111
;
ttms
.
open
(
file_name
,
ios
::
binary
|
ios
::
out
);
if
(
ttms
.
is_open
())
{
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
is
),
sizeof
(
int
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
_lm
),
sizeof
(
int
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
_vk
),
sizeof
(
double
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
_exri
),
sizeof
(
double
));
double
rval
,
ival
;
dcomplex
element
;
for
(
int
ei
=
0
;
ei
<
_lm
;
ei
++
)
{
element
=
-
1.0
/
_rmi
[
ei
][
0
];
rval
=
real
(
element
);
ival
=
imag
(
element
);
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
rval
),
sizeof
(
double
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
ival
),
sizeof
(
double
));
element
=
-
1.0
/
_rei
[
ei
][
0
];
rval
=
real
(
element
);
ival
=
imag
(
element
);
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
rval
),
sizeof
(
double
));
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
ival
),
sizeof
(
double
));
}
ttms
.
write
(
reinterpret_cast
<
char
*>
(
&
_sphere_radius
),
sizeof
(
double
));
ttms
.
close
();
}
else
{
// Failed to open output file. Should never happen.
printf
(
"ERROR: could not open Transition Matrix file for writing.
\n
"
);
}
}
bool
TransitionMatrix
::
operator
==
(
TransitionMatrix
&
other
)
{
if
(
is
!=
other
.
is
)
{
return
false
;
...
...
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