12 #include "libmesh/threads.h" 22 mooseWarning(
"Conflicting MPI communicators specified in Abaqus compatibility objects. Are you " 23 "running a multiapps simulation?");
73 auto output_dir =
split.first;
77 mooseWarning(
"Conflicting output directories specified in Abaqus compatibility objects: ",
81 ". Are you running a multiapps simulation?");
84 mooseWarning(
"Conflicting job names specified in Abaqus compatibility objects: ",
88 ". Are you running a multiapps simulation?");
98 *len = output_dir.length();
99 for (
int i = 0; i < 256; ++i)
100 dir[i] = i < *len ? output_dir[i] :
' ';
107 *len = job_name.length();
108 for (
int i = 0; i < 256; ++i)
109 dir[i] = i < *len ? job_name[i] :
' ';
115 stdb_abqerr_(
int * lop,
char * format,
int * intv,
double * realv,
char * charv,
int format_len)
118 unsigned int int_index = 0;
119 unsigned int real_index = 0;
120 unsigned int char_index = 0;
122 for (
int i = 0; i < format_len; ++i)
125 if (format[i] ==
'%' && i < format_len - 1)
127 auto next = format[i + 1];
130 if (next ==
'I' || next ==
'i')
132 message += std::to_string(intv[int_index++]);
138 if (next ==
'R' || next ==
'r')
140 message += std::to_string(realv[real_index++]);
146 if (next ==
'S' || next ==
's')
148 for (
unsigned int j = 0;
j < 8; ++
j)
149 message += charv[char_index++];
182 mooseError(
"Invalid LOP code passed to STDB_ABQERR: ", *lop);
195 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
217 if (ib.second ==
false)
218 mooseError(
"Error creating threaded storage in SMAIntArrayCreate");
219 return ib.first->second.data();
226 if (ib.second ==
false)
227 mooseError(
"Error creating threaded storage in SMAFloatArrayCreate");
228 return ib.first->second.data();
236 "SMALocalIntArrayCreate")[id];
237 array.assign(len, val);
246 "SMALocalFloatArrayCreate")[id];
247 array.assign(len, val);
257 return it->second.data();
264 return it->second.data();
273 return it->second.data();
280 "SMALocalFloatArrayAccess");
282 return it->second.data();
287 extern "C" std::size_t
291 return it->second.size();
294 extern "C" std::size_t
298 return it->second.size();
301 extern "C" std::size_t
307 return it->second.size();
310 extern "C" std::size_t
316 return it->second.size();
348 "SMALocalFloatArrayDelete");
363 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
365 _mutex[n] = std::make_unique<Threads::spin_mutex>();
373 mooseError(
"Invalid or uninitialized mutex ", n);
381 mooseError(
"Invalid or uninitialized mutex ", n);
static std::string getOutputDir()
void stdb_abqerr_(int *lop, char *format, int *intv, double *realv, char *charv, int format_len)
int * SMAIntArrayAccess(int id)
void SMAIntArrayDelete(int id)
static void setCommunicator(const libMesh::Parallel::Communicator *communicator)
Global storage for the MPI communicator, this will be set by any Abaqus class.
static std::array< std::unique_ptr< Threads::spin_mutex >, 101 > _mutex
static std::string getJobName()
void mooseError(Args &&... args)
MPI_Comm get_communicator()
void mooseWarning(Args &&... args)
std::pair< std::filesystem::path, std::filesystem::path > splitFileName(const T &full_file)
double * SMALocalFloatArrayCreate(int id, int len, Real val)
static std::map< int, std::vector< T > >::iterator getSMAIterator(std::map< int, std::vector< T >> &array, int id, const std::string &function)
get data vector iterator with error checking
double * SMALocalFloatArrayAccess(int id)
std::size_t SMALocalIntArraySize(int id)
int * SMAIntArrayCreate(int id, int len, int val)
void SMALocalFloatArrayDelete(int id)
static void mutexInit(std::size_t n)
Mutex API.
static void smaInitialize()
thread storage initialization
static std::vector< std::map< int, std::vector< Real > > > _sma_local_float_array
std::string stripExtension(const std::string &s, const bool rfind=false)
static const libMesh::Parallel::Communicator * getCommunicator()
static void mutexLock(std::size_t n)
std::size_t SMAFloatArraySize(int id)
static void mutexUnlock(std::size_t n)
void SMALocalIntArrayDelete(int id)
static const libMesh::Parallel::Communicator * _communicator
double * SMAFloatArrayAccess(int id)
void getoutdir_(char *dir, int *len)
static std::string _output_dir
static std::string _job_name
static std::map< int, std::vector< int > > _sma_int_array
Shared Memory Arrays.
int * SMALocalIntArrayAccess(int id)
static const std::string message
DIE A HORRIBLE DEATH HERE typedef MPI_Comm communicator
void getnumcpus_(int *num)
void SMAFloatArrayDelete(int id)
std::size_t SMALocalFloatArraySize(int id)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
std::size_t SMAIntArraySize(int id)
void getjobname_(char *dir, int *len)
static std::map< int, std::vector< Real > > _sma_float_array
double * SMAFloatArrayCreate(int id, int len, Real val)
static void setInputFile(const std::string &input_file)
Global storage for the simulation output directory, this will be set by any Abaqus class...
std::string mooseMsgFmt(const std::string &msg, const std::string &title, const std::string &color)
int * SMALocalIntArrayCreate(int id, int len, int val)
static std::vector< std::map< int, std::vector< int > > > _sma_local_int_array
static std::map< int, std::vector< T > > & getSMAThreadArray(std::vector< std::map< int, std::vector< T >>> &local_array, const std::string &function)
get thread local array