Advanced Multi-Physics (AMP)
On-Line Documentation
Classes | Public Types | Public Member Functions | Static Public Member Functions | Static Public Attributes | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
AMP::ThreadPool Class Referencefinal

This is a concrete class that provides for a basic thread pool. More...

#include <ThreadPool.h>

Classes

class  condition_variable
 
class  WorkItemRet
 Class to define a work item returning a variable. More...
 

Public Types

typedef ThreadPoolWorkItem WorkItem
 Base class for the work item (users should derive from WorkItemRet)
 

Public Member Functions

std::vector< ThreadPoolIDadd_work (const std::vector< ThreadPool::WorkItem * > &work, const std::vector< int > &priority=std::vector< int >())
 Function to add multiple work items.
 
ThreadPoolID add_work (ThreadPool::WorkItem *work, int priority=0)
 Function to add a work item.
 
int getNumThreads () const
 Function to return the number of threads in the thread pool.
 
std::vector< int > getThreadAffinity (int thread) const
 
int getThreadNumber () const
 Function to return the current thread number.
 
bool isFinished (const ThreadPoolID &id) const
 Function to check if the work item has finished processing.
 
bool isValid (const ThreadPoolID &id) const
 Function to check if the work item is valid.
 
int N_queued () const
 Return the number of items queued.
 
ThreadPooloperator= (const ThreadPool &)=delete
 Assignment operator.
 
void setErrorHandler (std::function< void(const std::string &)> fun)
 Set the error handler for threads.
 
void setMaxWaitTimeDebug (const int time)
 Function to set the maximum wait time.
 
void setNumThreads (const int N, const std::string &affinity="none", const std::vector< int > &procs=std::vector< int >())
 Function to set the number of threads in the thread pool.
 
void setThreadAffinity (int thread, const std::vector< int > &procs) const
 
 ThreadPool (const int N=0, const std::string &affinity="none", const std::vector< int > &procs=std::vector< int >(), int queueSize=4096)
 
 ThreadPool (const ThreadPool &)=delete
 Copy constructor.
 
void wait (const ThreadPoolID &id) const
 Function to wait until a specific work item has finished.
 
void wait_all (const std::vector< ThreadPoolID > &ids) const
 Function to wait until all of the given work items have finished their work.
 
size_t wait_any (const std::vector< ThreadPoolID > &ids) const
 Function to wait until any of the given work items have finished their work.
 
void wait_pool_finished () const
 Function to wait until all work items in the thread pool have finished their work.
 
std::vector< int > wait_some (int N_wait, const std::vector< ThreadPoolID > &ids, int max_wait=10000000) const
 Function to wait until some of the given work items have finished their work.
 
 ~ThreadPool ()
 Destructor.
 

Static Public Member Functions

static std::vector< ThreadPoolIDadd_work (ThreadPool *tpool, const std::vector< ThreadPool::WorkItem * > &work, const std::vector< int > &priority=std::vector< int >())
 Function to add multiple work items.
 
static ThreadPoolID add_work (ThreadPool *tpool, ThreadPool::WorkItem *work, int priority=0)
 Function to add a work item.
 
template<class Ret , class... Args1, class... Args2>
static WorkItemcreateWork (Ret(*routine)(Args1...), Args2... args)
 Function to create a work item.
 
template<class Ret , class... Args1, class... Args2>
static WorkItemcreateWork (Ret(*routine)(Args1...), std::tuple< Args2... > &&args)
 Function to create a work item.
 
template<class Ret , class... Args1, class... Args2>
static WorkItemcreateWork (std::function< Ret(Args1...)> routine, Args2... args)
 Function to create a work item.
 
template<class Ret , class... Args1, class... Args2>
static WorkItemcreateWork (std::function< Ret(Args1...)> routine, std::tuple< Args2... > &&args)
 Function to create a work item.
 
static int getCurrentProcessor ()
 Function to return the processor number that the current thread is running on.
 
template<class return_type >
static return_type getFunctionRet (const ThreadPoolID &id)
 Function to get the returned function value.
 
static int getNumberOfProcessors ()
 Function to return the number of processors available.
 
static std::vector< int > getProcessAffinity ()
 Function to return the affinity of the current process.
 
static std::vector< int > getThreadAffinity ()
 Function to return the affinity of the current thread.
 
static bool is_valid (const ThreadPool *tpool)
 Function to check if the thread pool is valid.
 
static int numThreads (const ThreadPool *tpool)
 Function to return the number of work threads.
 
static void set_OS_warnings (int behavior=0)
 Function to enable/disable OS warning messages.
 
static void setProcessAffinity (const std::vector< int > &procs)
 Function to set the affinity of the current process.
 
static void setThreadAffinity (const std::vector< int > &procs)
 
static void wait_all (const ThreadPool *tpool, const std::vector< ThreadPoolID > &ids)
 Function to wait until all of the given work items have finished their work.
 
static void wait_pool_finished (const ThreadPool *tpool)
 Function to wait until all work items in the thread pool have finished their work.
 

Static Public Attributes

static constexpr uint16_t MAX_THREADS = 128
 

Private Types

typedef condition_variable cond_t
 
typedef volatile std::atomic_uint32_t vint32_t
 
typedef volatile std::atomic_uint64_t vint64_t
 

Private Member Functions

void add_work (size_t N, ThreadPool::WorkItem *work[], const int *priority, ThreadPoolID *id)
 
void check_startup ()
 
bool isMemberThread () const
 
void print_wait_warning () const
 
void tpool_thread (int id)
 
void wait_N (int N, double time) const
 
std::vector< bool > wait_some (size_t N_work, const ThreadPoolID *ids, size_t N_wait, int max_wait) const
 

Static Private Member Functions

static void create_new_thread (ThreadPool *tpool, int id)
 
static WorkItemgetFinishedWorkItem (const ThreadPoolID &id)
 

Private Attributes

vint64_t d_active [MAX_THREADS/64]
 
vint64_t d_cancel [MAX_THREADS/64]
 
std::function< void(const std::string &)> d_errorHandler
 
vint64_t d_id_assign
 
int d_max_wait_time
 
vint64_t d_N_added
 
vint64_t d_N_finished
 
vint64_t d_N_started
 
uint16_t d_N_threads
 
uint32_t d_NULL_HEAD
 
uint32_t d_NULL_TAIL
 
vint32_t d_num_active
 
ThreadPoolListQueue d_queue
 
vint32_t d_signal_count
 
volatile bool d_signal_empty
 
std::thread * d_thread
 
cond_t d_wait_finished
 
cond_t d_wait_work
 

Detailed Description

This is a concrete class that provides for a basic thread pool.

This class implements a basic thread pool that can be used for a wide variety of applications. An example call usage is provided below. The ability to return a value is provided. Note that there is a small overhead to using this functionality.

Example: 
Existing function call: double x = myfun_1(a,b); double y = myfun_2(c,d);
Threaded call (processing in parallel): ThreadPoolID ids[2]; ids[0] = TPOOL_ADD_WORK( tpool, myfun_1, (a,b) ); ids[1] = TPOOL_ADD_WORK( tpool, myfun_2, (c,d) ); wait_all(2,ids); double x = getFunctionRet(ids[0]); double y = getFunctionRet(ids[1]);

Definition at line 48 of file ThreadPool.h.

Member Typedef Documentation

◆ cond_t

Definition at line 516 of file ThreadPool.h.

◆ vint32_t

typedef volatile std::atomic_uint32_t AMP::ThreadPool::vint32_t
private

Definition at line 514 of file ThreadPool.h.

◆ vint64_t

typedef volatile std::atomic_uint64_t AMP::ThreadPool::vint64_t
private

Definition at line 515 of file ThreadPool.h.

◆ WorkItem

Base class for the work item (users should derive from WorkItemRet)

Definition at line 59 of file ThreadPool.h.

Constructor & Destructor Documentation

◆ ThreadPool() [1/2]

AMP::ThreadPool::ThreadPool ( const int  N = 0,
const std::string &  affinity = "none",
const std::vector< int > &  procs = std::vector< int >(),
int  queueSize = 4096 
)

Constructor that initialize the thread pool with N threads

Parameters
NThe desired number of worker threads
affinityThe affinity scheduler to use: none - Let the OS handle the affinities (default) independent - Give each thread an independent set of processors
procsThe processors to use (defaults to the process affinitiy list)
queueSizeThe maximum number of items in the queue before forcing a wait

◆ ThreadPool() [2/2]

AMP::ThreadPool::ThreadPool ( const ThreadPool )
delete

Copy constructor.

◆ ~ThreadPool()

AMP::ThreadPool::~ThreadPool ( )

Destructor.

Member Function Documentation

◆ add_work() [1/5]

std::vector< ThreadPoolID > AMP::ThreadPool::add_work ( const std::vector< ThreadPool::WorkItem * > &  work,
const std::vector< int > &  priority = std::vector< int >() 
)
inline

Function to add multiple work items.

This function adds multiple work item to the queue Note: any thread may call this routine.

Parameters
workVector of pointers to the work items to add Note that the threadpool will automatically destroy the item when finished
priorityVector of values indicating the priority of the work items

◆ add_work() [2/5]

void AMP::ThreadPool::add_work ( size_t  N,
ThreadPool::WorkItem work[],
const int *  priority,
ThreadPoolID id 
)
private

◆ add_work() [3/5]

static std::vector< ThreadPoolID > AMP::ThreadPool::add_work ( ThreadPool tpool,
const std::vector< ThreadPool::WorkItem * > &  work,
const std::vector< int > &  priority = std::vector< int >() 
)
inlinestatic

Function to add multiple work items.

This function adds multiple work item to the queue Note: any thread may call this routine.

Parameters
tpoolThreadpool to add work to (may be null)
workVector of pointers to the work items to add Note that the threadpool will automatically destroy the item when finished
priorityVector of values indicating the priority of the work items

◆ add_work() [4/5]

static ThreadPoolID AMP::ThreadPool::add_work ( ThreadPool tpool,
ThreadPool::WorkItem work,
int  priority = 0 
)
inlinestatic

Function to add a work item.

This function adds a work item to the queue Note: any thread may call this routine.

Parameters
tpoolThreadpool to add work to (may be null)
workPointer to the work item to add Note that the threadpool will automatically destroy the item when finished
priorityA value indicating the priority of the work item (0-default)

◆ add_work() [5/5]

ThreadPoolID AMP::ThreadPool::add_work ( ThreadPool::WorkItem work,
int  priority = 0 
)
inline

Function to add a work item.

This function adds a work item to the queue Note: any thread may call this routine.

Parameters
workPointer to the work item to add Note that the threadpool will automatically destroy the item when finished
priorityA value indicating the priority of the work item (0-default)

◆ check_startup()

void AMP::ThreadPool::check_startup ( )
private

◆ create_new_thread()

static void AMP::ThreadPool::create_new_thread ( ThreadPool tpool,
int  id 
)
inlinestaticprivate

Definition at line 487 of file ThreadPool.h.

References tpool_thread().

◆ createWork() [1/4]

template<class Ret , class... Args1, class... Args2>
static WorkItem * AMP::ThreadPool::createWork ( Ret(*)(Args1...)  routine,
Args2...  args 
)
inlinestatic

Function to create a work item.

This function creates a work item that can be added to the queue

Parameters
routineFunction to call from the thread pool
argsFunction arguments to pass

◆ createWork() [2/4]

template<class Ret , class... Args1, class... Args2>
static WorkItem * AMP::ThreadPool::createWork ( Ret(*)(Args1...)  routine,
std::tuple< Args2... > &&  args 
)
inlinestatic

Function to create a work item.

This function creates a work item that can be added to the queue

Parameters
routineFunction to call from the thread pool
argsFunction arguments to pass

◆ createWork() [3/4]

template<class Ret , class... Args1, class... Args2>
static WorkItem * AMP::ThreadPool::createWork ( std::function< Ret(Args1...)>  routine,
Args2...  args 
)
inlinestatic

Function to create a work item.

This function creates a work item that can be added to the queue

Parameters
routineFunction to call from the thread pool
argsFunction arguments to pass

◆ createWork() [4/4]

template<class Ret , class... Args1, class... Args2>
static WorkItem * AMP::ThreadPool::createWork ( std::function< Ret(Args1...)>  routine,
std::tuple< Args2... > &&  args 
)
inlinestatic

Function to create a work item.

This function creates a work item that can be added to the queue

Parameters
routineFunction to call from the thread pool
argsFunction arguments to pass

◆ getCurrentProcessor()

static int AMP::ThreadPool::getCurrentProcessor ( )
static

Function to return the processor number that the current thread is running on.

◆ getFinishedWorkItem()

static WorkItem * AMP::ThreadPool::getFinishedWorkItem ( const ThreadPoolID id)
inlinestaticprivate

Definition at line 481 of file ThreadPool.h.

◆ getFunctionRet()

template<class return_type >
static return_type AMP::ThreadPool::getFunctionRet ( const ThreadPoolID id)
inlinestatic

Function to get the returned function value.

This is the function returns the value that was returned from the working function. If the work item has not finished or was not found it will return 0.

Parameters
idThe id of the work item

◆ getNumberOfProcessors()

static int AMP::ThreadPool::getNumberOfProcessors ( )
static

Function to return the number of processors available.

◆ getNumThreads()

int AMP::ThreadPool::getNumThreads ( ) const
inline

Function to return the number of threads in the thread pool.

Definition at line 162 of file ThreadPool.h.

References d_N_threads.

Referenced by numThreads().

◆ getProcessAffinity()

static std::vector< int > AMP::ThreadPool::getProcessAffinity ( )
static

Function to return the affinity of the current process.

◆ getThreadAffinity() [1/2]

static std::vector< int > AMP::ThreadPool::getThreadAffinity ( )
static

Function to return the affinity of the current thread.

◆ getThreadAffinity() [2/2]

std::vector< int > AMP::ThreadPool::getThreadAffinity ( int  thread) const

Function to return the affinity of the given thread

Parameters
threadThe index of the thread

◆ getThreadNumber()

int AMP::ThreadPool::getThreadNumber ( ) const

Function to return the current thread number.

This function will return the thread number of current active thread. If the thread is not a member of the thread pool, this function will return 0.

Referenced by isMemberThread().

◆ is_valid()

static bool AMP::ThreadPool::is_valid ( const ThreadPool tpool)
static

Function to check if the thread pool is valid.

Sometimes it is necessary to work with raw pointers for the thread pool. If the thread pool is invalid and used, the program will likely fail catastrophically. This function checks if the thread pool is valid is a relatively safe manner. If the thread pool is pointing to an invalid memory address, because it has been freed, never allocated, or otherwise corrupted, this function will return false.

Parameters
tpoolPointer to the ThreadPool to check

◆ isFinished()

bool AMP::ThreadPool::isFinished ( const ThreadPoolID id) const
inline

Function to check if the work item has finished processing.

This function checks if the work item has finished processing.

Parameters
idThe id of the work item

Definition at line 215 of file ThreadPool.h.

◆ isMemberThread()

bool AMP::ThreadPool::isMemberThread ( ) const
inlineprivate

Definition at line 498 of file ThreadPool.h.

References getThreadNumber().

◆ isValid()

bool AMP::ThreadPool::isValid ( const ThreadPoolID id) const
inline

Function to check if the work item is valid.

This function checks if the work item has a valid id. Note: this function does not require blocking and will return immediately.

Parameters
idThe id of the work item

◆ N_queued()

int AMP::ThreadPool::N_queued ( ) const
inline

Return the number of items queued.

Definition at line 377 of file ThreadPool.h.

References d_queue, and AMP::ThreadPoolListQueue::size().

◆ numThreads()

static int AMP::ThreadPool::numThreads ( const ThreadPool tpool)
inlinestatic

Function to return the number of work threads.

This function returns the number of threads in the thread pool, or 0 if the thread pool is empty or does not exist

Parameters
tpoolThreadpool to add work to (may be null)

Definition at line 392 of file ThreadPool.h.

References getNumThreads().

◆ operator=()

ThreadPool & AMP::ThreadPool::operator= ( const ThreadPool )
delete

Assignment operator.

◆ print_wait_warning()

void AMP::ThreadPool::print_wait_warning ( ) const
private

◆ set_OS_warnings()

static void AMP::ThreadPool::set_OS_warnings ( int  behavior = 0)
static

Function to enable/disable OS warning messages.

Some of the functions such as setting/getting the thread affinities are not supported on all platforms. This function controls the behavior of these functions on systems where they are not supported. The default

behavior is to print a warning message. Other options include ignoring the messages (the functions will return empty sets), or throwing an exception. Note: this is a global property and will affect all thread pools in an application.

Parameters
behaviorThe behavior of OS specific messages/errors 0: Print a warning message 1: Ignore the messages 2: Throw an error

◆ setErrorHandler()

void AMP::ThreadPool::setErrorHandler ( std::function< void(const std::string &)>  fun)

Set the error handler for threads.

◆ setMaxWaitTimeDebug()

void AMP::ThreadPool::setMaxWaitTimeDebug ( const int  time)
inline

Function to set the maximum wait time.

This function sets the maximum time the thread pool will wait before warning about a possible hung thread. Default is to wait 10 minutes.

Parameters
timeThe number of seconds to wait (seconds)

Definition at line 190 of file ThreadPool.h.

References d_max_wait_time, and AMP::time.

◆ setNumThreads()

void AMP::ThreadPool::setNumThreads ( const int  N,
const std::string &  affinity = "none",
const std::vector< int > &  procs = std::vector< int >() 
)

Function to set the number of threads in the thread pool.

This function will change the number of worker threads in the ThreadPool to the number specified. This function will immediately change the number of threads in the ThreadPool without checking the existing work unless the desired number of threads is 0. In this case, the function will wait for all work items to finish before deleting the existing work threads. Member threads may not call this function.

Parameters
NThe desired number of worker threads
affinityThe affinity scheduler to use: none - Let the OS handle the affinities (default) independent - Give each thread an independent set of processors
procsThe processors to use (defaults to the process affinitiy list)

◆ setProcessAffinity()

static void AMP::ThreadPool::setProcessAffinity ( const std::vector< int > &  procs)
static

Function to set the affinity of the current process.

◆ setThreadAffinity() [1/2]

static void AMP::ThreadPool::setThreadAffinity ( const std::vector< int > &  procs)
static

Function to set the affinity of the current thread

Parameters
procsThe processors to use

◆ setThreadAffinity() [2/2]

void AMP::ThreadPool::setThreadAffinity ( int  thread,
const std::vector< int > &  procs 
) const

Set the given thread to have the specified affinity

Parameters
threadThe index of the thread
procsThe processors to use

◆ tpool_thread()

void AMP::ThreadPool::tpool_thread ( int  id)
private

Referenced by create_new_thread().

◆ wait()

void AMP::ThreadPool::wait ( const ThreadPoolID id) const
inline

Function to wait until a specific work item has finished.

This is the function waits for a specific work item to finished. Note: any thread may call this routine, but they will block until finished. For worker threads this may eventually lead to a deadlock.

Parameters
idThe work item to wait for

◆ wait_all() [1/2]

void AMP::ThreadPool::wait_all ( const std::vector< ThreadPoolID > &  ids) const
inline

Function to wait until all of the given work items have finished their work.

This is the function waits for all given of the work items to finish. Note: any thread may call this routine, but they will block until finished. For worker threads this may eventually lead to a deadlock.

Parameters
idsVector of work items to wait for

◆ wait_all() [2/2]

static void AMP::ThreadPool::wait_all ( const ThreadPool tpool,
const std::vector< ThreadPoolID > &  ids 
)
inlinestatic

Function to wait until all of the given work items have finished their work.

This is the function waits for all given of the work items to finish. Note: any thread may call this routine, but they will block until finished. For worker threads this may eventually lead to a deadlock.

Parameters
tpoolThreadpool containing work (must match call to add_work)
idsVector of work items to wait for

◆ wait_any()

size_t AMP::ThreadPool::wait_any ( const std::vector< ThreadPoolID > &  ids) const
inline

Function to wait until any of the given work items have finished their work.

This is the function waits for any of the given work items to finish. If successful it returns the index of a finished work item (the index in the array ids). Note: any thread may call this routine, but they will block until finished. For worker threads this may eventually lead to a deadlock.

Parameters
idsVector of work items to wait for

◆ wait_N()

void AMP::ThreadPool::wait_N ( int  N,
double  time 
) const
private

◆ wait_pool_finished() [1/2]

void AMP::ThreadPool::wait_pool_finished ( ) const

Function to wait until all work items in the thread pool have finished their work.

This function will wait until all work has finished. Note: member threads may not call this function. Only one non-member thread should call this routine at a time.

Referenced by wait_pool_finished().

◆ wait_pool_finished() [2/2]

static void AMP::ThreadPool::wait_pool_finished ( const ThreadPool tpool)
inlinestatic

Function to wait until all work items in the thread pool have finished their work.

This function will wait until all work has finished. Note: member threads may not call this function. Only one non-member thread should call this routine at a time.

Parameters
tpoolThreadpool containing work (must match call to add_work)

Definition at line 437 of file ThreadPool.h.

References wait_pool_finished().

◆ wait_some() [1/2]

std::vector< int > AMP::ThreadPool::wait_some ( int  N_wait,
const std::vector< ThreadPoolID > &  ids,
int  max_wait = 10000000 
) const
inline

Function to wait until some of the given work items have finished their work.

This is the function waits for some of the given work items to finish. If successful it returns the indicies of the finished work items (the index in the array ids). Note: any thread may call this routine, but they will block until finished. For worker threads this may eventually lead to a deadlock.

Parameters
N_waitNumber of work items to wait for
idsVector of work items to wait for
max_waitMaximum time to wait (seconds)
Returns
Returns the indicies items that have finished (in sorted order)

◆ wait_some() [2/2]

std::vector< bool > AMP::ThreadPool::wait_some ( size_t  N_work,
const ThreadPoolID ids,
size_t  N_wait,
int  max_wait 
) const
private

Member Data Documentation

◆ d_active

vint64_t AMP::ThreadPool::d_active[MAX_THREADS/64]
private

Definition at line 526 of file ThreadPool.h.

◆ d_cancel

vint64_t AMP::ThreadPool::d_cancel[MAX_THREADS/64]
private

Definition at line 527 of file ThreadPool.h.

◆ d_errorHandler

std::function<void(const std::string&)> AMP::ThreadPool::d_errorHandler
private

Definition at line 534 of file ThreadPool.h.

◆ d_id_assign

vint64_t AMP::ThreadPool::d_id_assign
private

Definition at line 525 of file ThreadPool.h.

◆ d_max_wait_time

int AMP::ThreadPool::d_max_wait_time
private

Definition at line 522 of file ThreadPool.h.

Referenced by setMaxWaitTimeDebug().

◆ d_N_added

vint64_t AMP::ThreadPool::d_N_added
private

Definition at line 528 of file ThreadPool.h.

◆ d_N_finished

vint64_t AMP::ThreadPool::d_N_finished
private

Definition at line 530 of file ThreadPool.h.

◆ d_N_started

vint64_t AMP::ThreadPool::d_N_started
private

Definition at line 529 of file ThreadPool.h.

◆ d_N_threads

uint16_t AMP::ThreadPool::d_N_threads
private

Definition at line 521 of file ThreadPool.h.

Referenced by getNumThreads().

◆ d_NULL_HEAD

uint32_t AMP::ThreadPool::d_NULL_HEAD
private

Definition at line 519 of file ThreadPool.h.

◆ d_NULL_TAIL

uint32_t AMP::ThreadPool::d_NULL_TAIL
private

Definition at line 536 of file ThreadPool.h.

◆ d_num_active

vint32_t AMP::ThreadPool::d_num_active
private

Definition at line 524 of file ThreadPool.h.

◆ d_queue

ThreadPoolListQueue AMP::ThreadPool::d_queue
private

Definition at line 533 of file ThreadPool.h.

Referenced by N_queued().

◆ d_signal_count

vint32_t AMP::ThreadPool::d_signal_count
mutableprivate

Definition at line 523 of file ThreadPool.h.

◆ d_signal_empty

volatile bool AMP::ThreadPool::d_signal_empty
mutableprivate

Definition at line 520 of file ThreadPool.h.

◆ d_thread

std::thread* AMP::ThreadPool::d_thread
private

Definition at line 535 of file ThreadPool.h.

◆ d_wait_finished

cond_t AMP::ThreadPool::d_wait_finished
mutableprivate

Definition at line 531 of file ThreadPool.h.

◆ d_wait_work

cond_t AMP::ThreadPool::d_wait_work
mutableprivate

Definition at line 532 of file ThreadPool.h.

◆ MAX_THREADS

constexpr uint16_t AMP::ThreadPool::MAX_THREADS = 128
staticconstexpr

Definition at line 52 of file ThreadPool.h.


The documentation for this class was generated from the following file:



Advanced Multi-Physics (AMP)
Oak Ridge National Laboratory
Idaho National Laboratory
Los Alamos National Laboratory
This page automatically produced from the
source code by doxygen
Last updated: Tue Mar 10 2026 13:06:42.
Comments on this page