Back to home page

EIC code displayed by LXR

 
 

    


Warning, file /include/Geant4/G4QSSubstepStruct.icc was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 //
0002 // ********************************************************************
0003 // * License and Disclaimer                                           *
0004 // *                                                                  *
0005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
0006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
0007 // * conditions of the Geant4 Software License,  included in the file *
0008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
0009 // * include a list of copyright holders.                             *
0010 // *                                                                  *
0011 // * Neither the authors of this software system, nor their employing *
0012 // * institutes,nor the agencies providing financial support for this *
0013 // * work  make  any representation or  warranty, express or implied, *
0014 // * regarding  this  software system or assume any liability for its *
0015 // * use.  Please see the license in the file  LICENSE  and URL above *
0016 // * for the full disclaimer and the limitation of liability.         *
0017 // *                                                                  *
0018 // * This  code  implementation is the result of  the  scientific and *
0019 // * technical work of the GEANT4 collaboration.                      *
0020 // * By using,  copying,  modifying or  distributing the software (or *
0021 // * any work based  on the software)  you  agree  to acknowledge its *
0022 // * use  in  resulting  scientific  publications,  and indicate your *
0023 // * acceptance of all terms of the Geant4 Software license.          *
0024 // ********************************************************************
0025 //
0026 // Structs used by G4QSStepper
0027 //
0028 // Author: Mattias Portnoy (Univ. Buenos Aires), 2024
0029 // --------------------------------------------------------------------
0030 
0031 inline Substep::Substep()  
0032 {
0033   for (G4int i = 1; i < MAX_QSS_ORDER; ++i)
0034   {
0035     std::fill_n(state_x[i], NUMBER_OF_VARIABLES_QSS, 0.0);
0036     std::fill_n(state_q[i], NUMBER_OF_VARIABLES_QSS, 0.0);
0037   }
0038   std::fill_n(state_x[MAX_QSS_ORDER], NUMBER_OF_VARIABLES_QSS, 0.0);
0039 
0040   std::fill_n(state_tx, NUMBER_OF_VARIABLES_QSS, 0.0);
0041   std::fill_n(state_tq, NUMBER_OF_VARIABLES_QSS, 0.0);
0042 }
0043 
0044 // ----------------------------------------------------------------------------
0045 
0046 inline Substeps::Substeps()
0047 {
0048   _substeps = static_cast<Substep *>(malloc((_arrlength) * sizeof(Substep)));    
0049 }
0050 
0051 // ----------------------------------------------------------------------------
0052 
0053 inline Substeps::~Substeps()
0054 {
0055   free(_substeps);
0056 }
0057 
0058 // ----------------------------------------------------------------------------
0059 
0060 // Mimics the functionality of GNU method reallocarray 
0061 inline void* Substeps::safe_reallocarray(void* ptr, size_t numMembers, size_t size)
0062 {
0063   if (size != 0 && numMembers > std::numeric_limits<size_t>::max() / size)
0064   {
0065     return nullptr;
0066   }
0067   return realloc(ptr, numMembers * size);
0068 }
0069  
0070 // ----------------------------------------------------------------------------
0071 
0072 inline void Substeps::resize()
0073 {
0074   _arrlength = std::fmax(_arrlength*2, 1500);
0075   _substeps = static_cast<Substep *>(safe_reallocarray(_substeps, _arrlength, sizeof(Substep)));
0076   if( _substeps == nullptr )
0077   { 
0078      G4ExceptionDescription ermsg;
0079      ermsg << "QSS2: Size of state exceed available memory : number of elemets = " << _arrlength
0080            << " size of each element= " << sizeof(Substep) << G4endl;
0081      G4Exception( "G4QSSubstepStruct::resize", "GeomField0008", FatalException, ermsg ); 
0082   }
0083 }
0084 
0085 // ----------------------------------------------------------------------------
0086 
0087 inline Substep* Substeps::create_substep()
0088 {
0089   current_substep_index++;
0090 
0091   if (unlikely( current_substep_index >= _arrlength ))
0092   {
0093     resize();
0094   }
0095   return &(_substeps[current_substep_index]);
0096 }
0097 
0098 // ----------------------------------------------------------------------------
0099 
0100 inline void Substeps::save_substep(Substep* substep)
0101 {
0102   memcpy(create_substep(), substep, sizeof(Substep));
0103 }
0104 
0105 // ----------------------------------------------------------------------------
0106 
0107 inline void Substeps::reset()
0108 {
0109   current_substep_index = -1;
0110 }