void ElectroIonicModel::computeGatingVariablesWithRushLarsen ( std::vector<vectorPtr_Type>& v, const Real dt ) { int nodes = ( * (v.at (0) ) ).epetraVector().MyLength(); std::vector<Real> localVec ( M_numberOfEquations, 0.0 ); int j (0); for ( int k = 0; k < nodes; k++ ) { j = ( * (v.at (0) ) ).blockMap().GID (k); for ( int i = 0; i < M_numberOfEquations; i++ ) { localVec.at (i) = ( * ( v.at (i) ) ) [j]; } computeGatingVariablesWithRushLarsen (localVec, dt); for ( int i = 0; i < M_numberOfEquations; i++ ) { ( * ( v.at (i) ) ) [j] = localVec.at (i); } } }
void ElectroIonicModel::computeRhs ( const std::vector<vectorPtr_Type>& v, std::vector<vectorPtr_Type>& rhs ) { int nodes = ( * (v.at (1) ) ).epetraVector().MyLength(); std::vector<Real> localVec ( M_numberOfEquations, 0.0 ); std::vector<Real> localRhs ( M_numberOfEquations, 0.0 ); int j (0); for ( int k = 0; k < nodes; k++ ) { j = ( * (v.at (1) ) ).blockMap().GID (k); for ( int i = 0; i < M_numberOfEquations; i++ ) { localVec.at (i) = ( * ( v.at (i) ) ) [j]; } if (M_appliedCurrentPtr) { M_appliedCurrent = (*M_appliedCurrentPtr) [j]; } else { M_appliedCurrent = 0.0; } computeRhs ( localVec, localRhs ); addAppliedCurrent (localRhs); for ( int i = 0; i < M_numberOfEquations; i++ ) { ( * ( rhs.at (i) ) ) [j] = localRhs.at (i); } } }
void ElectroIonicModel::computePotentialRhsICI ( const std::vector<vectorPtr_Type>& v, std::vector<vectorPtr_Type>& rhs, matrix_Type& massMatrix ) { int nodes = ( * (v.at (0) ) ).epetraVector().MyLength(); ( * ( rhs.at (0) ) ) *= 0.0; std::vector<Real> localVec ( M_numberOfEquations, 0.0 ); int j (0); for ( int k = 0; k < nodes; k++ ) { j = ( * (v.at (0) ) ).blockMap().GID (k); for ( int i = 0; i < M_numberOfEquations; i++ ) { localVec.at (i) = ( * ( v.at (i) ) ) [j]; } if (M_appliedCurrentPtr) { M_appliedCurrent = (*M_appliedCurrentPtr) [j]; } else { M_appliedCurrent = 0.0; } ( * ( rhs.at (0) ) ) [j] = computeLocalPotentialRhs ( localVec ) + M_appliedCurrent; } ( * ( rhs.at (0) ) ) = massMatrix * ( * ( rhs.at (0) ) ); }
void DOFVectorBase<double>::getD2AtQPs( const ElInfo* elInfo, const Quadrature* quad, const FastQuadrature* quadFast, DenseVector<D2Type<double>::type>& d2AtQPs) const { FUNCNAME("DOFVector<double>::getD2AtQPs()"); TEST_EXIT_DBG(quad || quadFast)("neither quad nor quadFast defined\n"); if (quad && quadFast) { TEST_EXIT_DBG(quad == quadFast->getQuadrature()) ("quad != quadFast->quadrature\n"); } TEST_EXIT_DBG(!quadFast || quadFast->getBasisFunctions() == feSpace->getBasisFcts()) ("invalid basis functions"); Element* el = elInfo->getElement(); int dow = Global::getGeo(WORLD); int nPoints = quadFast ? quadFast->getQuadrature()->getNumPoints() : quad->getNumPoints(); DenseVector<double> localVec(nBasFcts); getLocalVector(el, localVec); DimMat<double> D2Tmp(dim, dim, 0.0); int parts = Global::getGeo(PARTS, dim); const DimVec<WorldVector<double>>& grdLambda = elInfo->getGrdLambda(); d2AtQPs.change_dim(nPoints); if (quadFast) { for (int iq = 0; iq < nPoints; iq++) { for (int k = 0; k < parts; k++) for (int l = 0; l < parts; l++) D2Tmp[k][l] = 0.0; for (int i = 0; i < nBasFcts; i++) { for (int k = 0; k < parts; k++) for (int l = 0; l < parts; l++) D2Tmp[k][l] += localVec[i] * quadFast->getSecDer(iq, i, k, l); } for (int i = 0; i < dow; i++) for (int j = 0; j < dow; j++) { d2AtQPs[iq][i][j] = 0.0; for (int k = 0; k < parts; k++) for (int l = 0; l < parts; l++) d2AtQPs[iq][i][j] += grdLambda[k][i]*grdLambda[l][j]*D2Tmp[k][l]; } } } else { const BasisFunction* basFcts = feSpace->getBasisFcts(); DimMat<double> D2Phi(dim, dim); for (int iq = 0; iq < nPoints; iq++) { for (int k = 0; k < parts; k++) for (int l = 0; l < parts; l++) D2Tmp[k][l] = 0.0; for (int i = 0; i < nBasFcts; i++) { WARNING("not tested after index correction\n"); (*(basFcts->getD2Phi(i)))(quad->getLambda(iq), D2Phi); for (int k = 0; k < parts; k++) for (int l = 0; l < parts; l++) D2Tmp[k][l] += localVec[i] * D2Phi[k][l]; } for (int i = 0; i < dow; i++) for (int j = 0; j < dow; j++) { d2AtQPs[iq][i][j] = 0.0; for (int k = 0; k < parts; k++) for (int l = 0; l < parts; l++) d2AtQPs[iq][i][j] += grdLambda[k][i] * grdLambda[l][j] * D2Tmp[k][l]; } } } }