当前位置: 首页>>代码示例>>C++>>正文


C++ World::ConcomitantField方法代码示例

本文整理汇总了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;

			
//.........这里部分代码省略.........
开发者ID:welcheb,项目名称:jemris,代码行数:101,代码来源:Bloch_McConnell_CV_Model.cpp


注:本文中的World::ConcomitantField方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。