本文整理汇总了C++中World::ConcomitantField方法的典型用法代码示例。如果您正苦于以下问题:C++ World::ConcomitantField方法的具体用法?C++ World::ConcomitantField怎么用?C++ World::ConcomitantField使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类World
的用法示例。
在下文中一共展示了World::ConcomitantField方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: bloch
static int bloch (realtype t, N_Vector y, N_Vector ydot, void *pWorld) {
World* pW = (World*) pWorld;
BMAux* m_bmaux = (BMAux*) pW->auxiliary;
int m_nprops = pW->m_noofspinprops;
int m_ncomp = pW->m_noofspincompartments;
int m_ncoprops = (m_nprops - 4) / m_ncomp;
double* m_exrates = m_bmaux->exrates;
bool m_single = m_bmaux->single;
// Magnetisation for each poosl
double* Mxy = new double [m_ncomp];
double* phi = new double [m_ncomp];
double* Mz = new double [m_ncomp];
double* s = new double [m_ncomp];
double* c = new double [m_ncomp];
double* Mx = new double [m_ncomp];
double* My = new double [m_ncomp];
double* Mx_dot = new double [m_ncomp];
double* My_dot = new double [m_ncomp];
double* Mz_dot = new double [m_ncomp];
for (int i = 0; i < m_ncomp; i++) {
Mx_dot[i] = 0.0;
My_dot[i] = 0.0;
Mz_dot[i] = 0.0;
Mxy [i] = 0.0;
phi [i] = 0.0;
Mx [i] = 0.0;
My [i] = 0.0;
Mz [i] = 0.0;
s [i] = 0.0;
c [i] = 0.0;
}
//get current B-field values from the sequence
if (t<=0.0 || t>pW->pAtom->GetDuration()) { // Kaveh, hier hab ich gemogelt
// this case can happen when searching for step size; in this area no solution is needed
// -> set ydot to any defined value.
for(int i = 0; i< m_ncomp*NEQ; i+=NEQ) {
NV_Ith_S(ydot,XC+i) = 0.0; NV_Ith_S(ydot,YC+i) = 0.0; NV_Ith_S(ydot,ZC+i) = 0.0;
}
return 0;
}
double d_SeqVal[5] = {0.0,0.0,0.0,0.0,0.0}; // [B1magn,B1phase,Gx,Gy,Gz]
pW->pAtom->GetValue( d_SeqVal, t ); // calculates also pW->NonLinGradField
if (pW->pStaticAtom != NULL) pW->pStaticAtom->GetValue( d_SeqVal, t ); // calculates also pW->NonLinGradField
double Bx=0.0, By=0.0, Bz=0.0;
double* BzPool = new double[m_ncomp];
//RF field
Bx = d_SeqVal[RF_AMP]*cos(d_SeqVal[RF_PHS]);
By = d_SeqVal[RF_AMP]*sin(d_SeqVal[RF_PHS]);
//Gradient field
Bz = pW->Values[XC]*d_SeqVal[GRAD_X]+ pW->Values[YC]*d_SeqVal[GRAD_Y]+ pW->Values[ZC]*d_SeqVal[GRAD_Z];
//other off-resonance contributions (differs for every pool)
for(int i = 0; i< m_ncomp; i++)
BzPool[i] = Bz + pW->Values[i*m_ncoprops+DB] + pW->ConcomitantField(&d_SeqVal[GRAD_X]) + pW->NonLinGradField;
//NV_Ith_S is the solution magn. vector with components AMPL,PHASE,ZC
//important: restrict phase to [0, 2*PI]
int pool =0;
/* for(int i = 0; i< m_ncomp*NEQ; i+=NEQ){ // loop over pools
NV_Ith_S(y,PHASE+i) = fmod(NV_Ith_S(y,PHASE+i),6.28318530717958);
Mxy[pool] = NV_Ith_S(y,AMPL+i); phi[pool] = NV_Ith_S(y,PHASE+i); Mz[pool] = NV_Ith_S(y,ZC+i);
pool++;
}*/
for (int i = 0; i< m_ncomp*NEQ; i+=NEQ) { // loop over pools
Mx[pool] = NV_Ith_S(y,XC+i);
My[pool] = NV_Ith_S(y,YC+i);
Mz[pool] = NV_Ith_S(y,ZC+i);
pool++;
}
pool = 0;
for (int eqpool = 0; eqpool< ((m_ncomp)*NEQ); eqpool+=NEQ) { // loop over pools, NEQ steps
//avoid CVODE warnings (does not change physics!)
if (pW->Values[pool*m_ncoprops + M0] == 0.0) {
// this pool is empty, the number of pools reduces
NV_Ith_S(y,XC+eqpool) = 0.0; NV_Ith_S(y,YC+eqpool) = 0.0;
NV_Ith_S(ydot,XC+eqpool) = 0.0; NV_Ith_S(ydot,YC+eqpool) = 0.0;
NV_Ith_S(y,ZC+eqpool) = 0.0;
NV_Ith_S(ydot,ZC+eqpool) = 0.0;
//.........这里部分代码省略.........