ProSHADE  0.7.6.0 (JUL 2021)
Protein Shape Detection
ProSHADE_wignerMatrices.cpp
Go to the documentation of this file.
1 
22 //==================================================== ProSHADE
24 
28 {
29  //================================================ Sanity check
30  if ( this->maxCompBand == 0 )
31  {
32  throw ProSHADE_exception ( "Attempted allocating Wigner D matrices before\n : allocating E matrices memory.", "EW00024", __FILE__, __LINE__, __func__, "The E matrices and Wigner matrices both require to know\n : the bandwidth of the comparison (which may differ from the\n : object bandwidth). This is set when allocating E matrices\n : and therefore if it is 0 now, E matrices were not yet\n : allocated." );
33  }
34 
35  //================================================ Allocate bands
36  this->wignerMatrices = new proshade_complex** [this->maxCompBand];
37  ProSHADE_internal_misc::checkMemoryAllocation ( this->wignerMatrices, __FILE__, __LINE__, __func__ );
38 
39  //================================================ Allocate the arrays
40  for ( proshade_unsign bandIter = 0; bandIter < this->maxCompBand; bandIter++ )
41  {
42  //============================================ Allocate order 1
43  this->wignerMatrices[bandIter] = new proshade_complex* [(bandIter * 2) + 1];
44  ProSHADE_internal_misc::checkMemoryAllocation ( this->wignerMatrices[bandIter], __FILE__, __LINE__, __func__ );
45 
46  //============================================ Allocate order 2
47  for ( proshade_unsign order1Iter = 0; order1Iter < ( (bandIter * 2) + 1 ); order1Iter++ )
48  {
49  this->wignerMatrices[bandIter][order1Iter] = new proshade_complex [(bandIter * 2) + 1];
50  ProSHADE_internal_misc::checkMemoryAllocation ( this->wignerMatrices[bandIter], __FILE__, __LINE__, __func__ );
51  }
52  }
53 
54  //================================================ Done
55  return ;
56 
57 }
58 
75 void ProSHADE_internal_wigner::allocateWignerWorkspace ( proshade_double*& matIn, proshade_double*& matOut, proshade_double*& sqrts, proshade_double*& workspace, proshade_double*& alphaExponentReal, proshade_double*& alphaExponentImag, proshade_double*& gammaExponentReal, proshade_double*& gammaExponentImag, proshade_double*& trigs, proshade_unsign compBand )
76 {
77  //================================================ Allocate the memory
78  matIn = new proshade_double[static_cast<proshade_unsign> ( 4 * pow( compBand, 2.0 ) ) - 4 * compBand + 1];
79 
80  matOut = new proshade_double[static_cast<proshade_unsign> ( 4 * pow( compBand, 2.0 ) ) - 4 * compBand + 1];
81  sqrts = new proshade_double[static_cast<proshade_unsign> ( 2 * compBand )];
82  workspace = new proshade_double[static_cast<proshade_unsign> ( 4 * pow( compBand, 2.0 ) )];
83  alphaExponentReal = new proshade_double[static_cast<proshade_unsign> ( 2 * compBand - 1 )];
84  alphaExponentImag = new proshade_double[static_cast<proshade_unsign> ( 2 * compBand - 1 )];
85  gammaExponentReal = new proshade_double[static_cast<proshade_unsign> ( 2 * compBand - 1 )];
86  gammaExponentImag = new proshade_double[static_cast<proshade_unsign> ( 2 * compBand - 1 )];
87  trigs = new proshade_double[2];
88 
89  //================================================ Check memory allocation
90  ProSHADE_internal_misc::checkMemoryAllocation ( matIn, __FILE__, __LINE__, __func__ );
91  ProSHADE_internal_misc::checkMemoryAllocation ( matOut, __FILE__, __LINE__, __func__ );
92  ProSHADE_internal_misc::checkMemoryAllocation ( sqrts, __FILE__, __LINE__, __func__ );
93  ProSHADE_internal_misc::checkMemoryAllocation ( workspace, __FILE__, __LINE__, __func__ );
94  ProSHADE_internal_misc::checkMemoryAllocation ( alphaExponentReal, __FILE__, __LINE__, __func__ );
95  ProSHADE_internal_misc::checkMemoryAllocation ( alphaExponentImag, __FILE__, __LINE__, __func__ );
96  ProSHADE_internal_misc::checkMemoryAllocation ( gammaExponentReal, __FILE__, __LINE__, __func__ );
97  ProSHADE_internal_misc::checkMemoryAllocation ( gammaExponentImag, __FILE__, __LINE__, __func__ );
98  ProSHADE_internal_misc::checkMemoryAllocation ( trigs, __FILE__, __LINE__, __func__ );
99 
100  //================================================ Done
101  return ;
102 
103 }
104 
116 void ProSHADE_internal_wigner::releaseWignerWorkspace ( proshade_double*& matIn, proshade_double*& matOut, proshade_double*& sqrts, proshade_double*& workspace, proshade_double*& alphaExponentReal, proshade_double*& alphaExponentImag, proshade_double*& gammaExponentReal, proshade_double*& gammaExponentImag, proshade_double*& trigs )
117 {
118  //================================================ Allocate the memory
119  if ( matIn != nullptr ) { delete[] matIn; }
120  if ( matOut != nullptr ) { delete[] matOut; }
121  if ( sqrts != nullptr ) { delete[] sqrts; }
122  if ( workspace != nullptr ) { delete[] workspace; }
123  if ( trigs != nullptr ) { delete[] trigs; }
124  if ( alphaExponentReal != nullptr ) { delete[] alphaExponentReal; }
125  if ( alphaExponentImag != nullptr ) { delete[] alphaExponentImag; }
126  if ( gammaExponentReal != nullptr ) { delete[] gammaExponentReal; }
127  if ( gammaExponentImag != nullptr ) { delete[] gammaExponentImag; }
128 
129  //================================================ Done
130  return ;
131 
132 }
133 
147 void ProSHADE_internal_wigner::prepareTrigsSqrtsAndExponents ( proshade_double* sqrts, proshade_double* alphaExponentReal, proshade_double* alphaExponentImag, proshade_double* gammaExponentReal, proshade_double* gammaExponentImag, proshade_double* trigs, proshade_unsign compBand, proshade_double angAlpha, proshade_double angBeta, proshade_double angGamma )
148 {
149  //================================================ Compute the square roots
150  for ( proshade_unsign iter = 0; iter < ( 2 * compBand ); iter++ )
151  {
152  sqrts[iter] = static_cast<proshade_double> ( sqrt ( static_cast<proshade_double> ( iter ) ) );
153  }
154 
155  //================================================ Compute the trig values
156  trigs[0] = static_cast<proshade_double> ( cos ( 0.5 * -angBeta ) );
157  trigs[1] = static_cast<proshade_double> ( sin ( 0.5 * -angBeta ) );
158 
159  //================================================ Get alpha and gamma exponents
160  genExp ( static_cast< int > ( compBand ), angAlpha, alphaExponentReal, alphaExponentImag );
161  genExp ( static_cast< int > ( compBand ), angGamma, gammaExponentReal, gammaExponentImag );
162 
163  //================================================ Done
164  return ;
165 
166 }
167 
187 void ProSHADE_internal_wigner::computeWignerMatrices ( ProSHADE_settings* settings, ProSHADE_internal_data::ProSHADE_data* obj, proshade_double* alphaExponentReal, proshade_double* alphaExponentImag, proshade_double* gammaExponentReal, proshade_double* gammaExponentImag, proshade_double* matIn, proshade_double* matOut, proshade_double* trigs, proshade_double* sqrts, proshade_double* workspace )
188 {
189  //================================================ Report progress
190  ProSHADE_internal_messages::printProgressMessage ( settings->verbose, 4, "Start Wigner D matrix computation." );
191 
192  //================================================ For each band, find the Wigned d matrix
193  proshade_double *expARStart, *expAIStart, *expGRStart, *expGIStart;
194  proshade_double Dij, eARi, eAIi, eGRj, eGIj, iSign, rSign;
195  proshade_complex hlpVal;
196  proshade_unsign noOrders, arrConvIter;
197  for ( proshade_unsign bandIter = 0; bandIter < obj->getComparisonBand(); bandIter++ )
198  {
199  //============================================ Initialise loop
200  noOrders = 2 * bandIter + 1;
201  arrConvIter = 0;
202  expARStart = &alphaExponentReal[ (obj->getComparisonBand() - 1) - bandIter ];
203  expAIStart = &alphaExponentImag[ (obj->getComparisonBand() - 1) - bandIter ];
204  expGRStart = &gammaExponentReal[ (obj->getComparisonBand() - 1) - bandIter ];
205  expGIStart = &gammaExponentImag[ (obj->getComparisonBand() - 1) - bandIter ];
206  iSign = 1.0;
207  rSign = 1.0;
208 
209  //============================================ Get wigner d matrix values using beta angles only
210  wignerdmat ( static_cast< int > ( bandIter ), matIn, matOut, trigs, sqrts, workspace );
211 
212  //============================================ Multiply the wigner d matrix by alpha and gamma values and save the wigner D matrix to output array
213  for ( proshade_unsign d1Iter = 0; d1Iter < noOrders; d1Iter++ )
214  {
215  eARi = expARStart[d1Iter];
216  eAIi = expAIStart[d1Iter];
217 
218  for ( proshade_unsign d2Iter = 0; d2Iter < noOrders; d2Iter++ )
219  {
220  Dij = matOut[arrConvIter];
221  eGRj = expGRStart[d2Iter];
222  eGIj = expGIStart[d2Iter];
223 
224  hlpVal[0] = ( Dij * eGRj * eARi - Dij * eGIj * eAIi ) * rSign;
225  hlpVal[1] = ( Dij * eGRj * eAIi + Dij * eGIj * eARi ) * iSign;
226  obj->setWignerMatrixValue ( hlpVal, bandIter, d1Iter, d2Iter );
227 
228  arrConvIter += 1;
229  iSign *= -1.0;
230  rSign *= -1.0;
231  }
232  }
233 
234  //============================================ Get ready for next wigner matrix calculation
235  memcpy ( matIn, matOut, sizeof ( proshade_double ) * ( noOrders * noOrders ) );
236  }
237 
238  //================================================ Report progress
239  ProSHADE_internal_messages::printProgressMessage ( settings->verbose, 5, "Wigner D matrices obtained." );
240 
241  //================================================ Done
242  return ;
243 
244 }
245 
258 void ProSHADE_internal_wigner::computeWignerMatricesForRotation ( ProSHADE_settings* settings, ProSHADE_internal_data::ProSHADE_data* obj, proshade_double eulerAlpha, proshade_double eulerBeta, proshade_double eulerGamma )
259 {
260  //================================================ Initialise local variables
261  proshade_double *matIn, *matOut, *sqrts, *workspace, *alphaExponentReal, *alphaExponentImag, *gammaExponentReal, *gammaExponentImag, *trigs;
262 
263  //================================================ Allocate memory for Wigner matrices
265 
266  //================================================ Allocate the workspace memory
267  allocateWignerWorkspace ( matIn, matOut, sqrts, workspace, alphaExponentReal, alphaExponentImag,
268  gammaExponentReal, gammaExponentImag, trigs, obj->getComparisonBand() );
269 
270  //================================================ Prepare all values for the computation
271  prepareTrigsSqrtsAndExponents ( sqrts, alphaExponentReal, alphaExponentImag, gammaExponentReal, gammaExponentImag,
272  trigs, obj->getComparisonBand(), eulerAlpha, eulerBeta, eulerGamma );
273 
274  //================================================ Compute the values
275  computeWignerMatrices ( settings, obj, alphaExponentReal, alphaExponentImag, gammaExponentReal, gammaExponentImag,
276  matIn, matOut, trigs, sqrts, workspace );
277 
278  //================================================ Release the workspace memory
279  releaseWignerWorkspace ( matIn, matOut, sqrts, workspace, alphaExponentReal, alphaExponentImag,
280  gammaExponentReal, gammaExponentImag, trigs );
281 
282  //================================================ Done
283  return ;
284 
285 }
ProSHADE_internal_wigner::prepareTrigsSqrtsAndExponents
void prepareTrigsSqrtsAndExponents(proshade_double *sqrts, proshade_double *alphaExponentReal, proshade_double *alphaExponentImag, proshade_double *gammaExponentReal, proshade_double *gammaExponentImag, proshade_double *trigs, proshade_unsign compBand, proshade_double angAlpha, proshade_double angBeta, proshade_double angGamma)
This function sets all the values repeatedly required for the computation.
Definition: ProSHADE_wignerMatrices.cpp:147
ProSHADE_internal_data::ProSHADE_data::getComparisonBand
proshade_unsign getComparisonBand(void)
This function allows access to the maximum band for the comparison.
Definition: ProSHADE_data.cpp:3879
ProSHADE_exception
This class is the representation of ProSHADE exception.
Definition: ProSHADE_exceptions.hpp:37
ProSHADE_internal_data::ProSHADE_data::setWignerMatrixValue
void setWignerMatrixValue(proshade_complex val, proshade_unsign band, proshade_unsign order1, proshade_unsign order2)
This function allows setting the Wigner D matrix value by its band, order1 and order2 co-ordinate.
Definition: ProSHADE_data.cpp:4180
ProSHADE_internal_wigner::releaseWignerWorkspace
void releaseWignerWorkspace(proshade_double *&matIn, proshade_double *&matOut, proshade_double *&sqrts, proshade_double *&workspace, proshade_double *&alphaExponentReal, proshade_double *&alphaExponentImag, proshade_double *&gammaExponentReal, proshade_double *&gammaExponentImag, proshade_double *&trigs)
This function releases the memory for the Wigner matrices computation.
Definition: ProSHADE_wignerMatrices.cpp:116
ProSHADE_internal_data::ProSHADE_data::allocateWignerMatricesSpace
void allocateWignerMatricesSpace()
This function allocates the memory for the Wigner matrices for the calling object.
Definition: ProSHADE_wignerMatrices.cpp:27
ProSHADE_internal_data::ProSHADE_data
This class contains all inputed and derived data for a single structure.
Definition: ProSHADE_data.hpp:49
ProSHADE_internal_wigner::computeWignerMatrices
void computeWignerMatrices(ProSHADE_settings *settings, ProSHADE_internal_data::ProSHADE_data *obj, proshade_double *alphaExponentReal, proshade_double *alphaExponentImag, proshade_double *gammaExponentReal, proshade_double *gammaExponentImag, proshade_double *matIn, proshade_double *matOut, proshade_double *trigs, proshade_double *sqrts, proshade_double *workspace)
This function does the actual computation of the Wigner D matrices.
Definition: ProSHADE_wignerMatrices.cpp:187
ProSHADE_settings::verbose
proshade_signed verbose
Should the software report on the progress, or just be quiet? Value between -1 (nothing) and 4 (loud)
Definition: ProSHADE_settings.hpp:140
ProSHADE_internal_wigner::computeWignerMatricesForRotation
void computeWignerMatricesForRotation(ProSHADE_settings *settings, ProSHADE_internal_data::ProSHADE_data *obj, proshade_double eulerAlpha, proshade_double eulerBeta, proshade_double eulerGamma)
This function computes the Wigner D matrices for a particular set of Euler angles.
Definition: ProSHADE_wignerMatrices.cpp:258
ProSHADE_internal_data::ProSHADE_data::maxCompBand
proshade_unsign maxCompBand
The largest comparison band - this variable tells how large arrays will be allocated for the comparis...
Definition: ProSHADE_data.hpp:132
ProSHADE_settings
This class stores all the settings and is passed to the executive classes instead of a multitude of p...
Definition: ProSHADE_settings.hpp:37
ProSHADE_internal_data::ProSHADE_data::wignerMatrices
proshade_complex *** wignerMatrices
These matrices are computed for a particular rotation to be done in spherical harmonics.
Definition: ProSHADE_data.hpp:131
ProSHADE_internal_misc::checkMemoryAllocation
void checkMemoryAllocation(chVar checkVar, std::string fileP, unsigned int lineP, std::string funcP, std::string infoP="This error may occurs when ProSHADE requests memory to be\n : allocated to it and this operation fails. This could\n : happen when not enough memory is available, either due to\n : other processes using a lot of memory, or when the machine\n : does not have sufficient memory available. Re-run to see\n : if this problem persists.")
Checks if memory was allocated properly.
Definition: ProSHADE_misc.hpp:67
ProSHADE_internal_wigner::allocateWignerWorkspace
void allocateWignerWorkspace(proshade_double *&matIn, proshade_double *&matOut, proshade_double *&sqrts, proshade_double *&workspace, proshade_double *&alphaExponentReal, proshade_double *&alphaExponentImag, proshade_double *&gammaExponentReal, proshade_double *&gammaExponentImag, proshade_double *&trigs, proshade_unsign compBand)
This function allocates the memory for the Wigner matrices computation.
Definition: ProSHADE_wignerMatrices.cpp:75
ProSHADE_wignerMatrices.hpp
This header declares the functions required to compute the Wigner D matrices.
ProSHADE_internal_messages::printProgressMessage
void printProgressMessage(proshade_signed verbose, proshade_signed messageLevel, std::string message)
General stdout message printing.
Definition: ProSHADE_messages.cpp:70